package com.itheima.demo01.Lambda;
/*
Lambda表达式标准格式:
三部分组成:
一些参数
一个箭头
一段代码
格式:
(参数列表)->{一些重写方法的代码}
解释说明格式:
():接口中抽象方法的参数列表,没有参数,就空着,有参数就写出参数,多个参数使用逗号分隔
->:传递的意思,把参数传递给方法体
{}:重写接口的抽象方法的方法体
*/
public class Demo02Lambda {
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}).start();
}
}
无参无返回值
package com.itheima.demo02.Lambda;
/*
需求:
给定一个厨子Cook接口,内含唯一的抽象方法makeFood,且无参数 返回值
使用Lambda的标准格式调用invokeCook方法,打印输出"吃饭了"
*/
public class Demo01Cook {
public static void main(String[] args) {
//调用invokeCook方法,参数是Cook接口,传递Cook接口的匿名内部类对象
invokeCook(new Cook() {
@Override
public void makeFood() {
System.out.println("吃饭了");
}
});
//使用Lambda表达式,简化匿名内部类的书写
invokeCook(() -> {
System.out.println("吃饭了");
});
}
private static void invokeCook(Cook cook) {
cook.makeFood();
}
}
interface Cook {
void makeFood();
}
有参有返回值
package com.itheima.demo03.Lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class Demo01Arrays {
public static void main(String[] args) {
//使用数组存储多个Person对象
Person[] arr = {
new Person("柳岩", 23),
new Person("热巴", 13),
new Person("娜扎", 33)
};
// Arrays.sort(arr, new Comparator<Person>() {
// @Override
// public int compare(Person o1, Person o2) {
// return o1.getAge()-o2.getAge();
// }
// });
//使用Lambda表达式
Arrays.sort(arr, (i1, i2) -> {
return i1.getAge() - i2.getAge();
});
for (Person p : arr) {
System.out.println(p);
}
}
}
package com.itheima.demo04.Lambda;
public class Demo01InvokeCalc {
public static void main(String[] args) {
/* invokeCalc(1, 2, new Calculator() {
@Override
public int calc(int a, int b) {
return a+b;
}
});*/
invokeCalc(12, 2, (a, b) ->
a + b
);
}
public static void invokeCalc(int a, int b, Calculator calculator) {
int sum = calculator.calc(a, b);
System.out.println(sum);
}
}
Lambda的使用规则
package com.itheima.demo05.Lambda;
import java.util.ArrayList;
/*
Lambda表达式:是可推导,可以省略
凡是根据上下文推导出来的内容,都可以省略书写
可以省略的内容:
1.(参数列表):括号中参数列表的数据类型,可以省略不写
2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
3.{写代码}:如果{}中的代码只有一个一行,无论是否以后返回值,都可以省略({},return,分号)
注意:要省略{},ruturn ,分号必须一起省略
Lambda的使用前提
1.使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法
无论是JDK内置的Runnable/Comparator接口还是自定义接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda
2.使用Lambda必须具有上下文推断
方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例
*/
public class Demo01ArrayList {
public static void main(String[] args) {
//JDK1.7版本之前,创建集合对象必须把前后的泛型都写上
ArrayList<String> list1 = new ArrayList<>();
//JDK1.7之后,等号后面的泛型可以省略
}
}