Java 8 Lambda表达式
@Test
public void test2() {
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
int compare1 = com1.compare(1, 2);
System.out.println(compare1);
System.out.println("**************************");
//lambda表达式写法
Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
int compare2 = com2.compare(-1, 2);
System.out.println(compare2);
System.out.println("**************************");
//方法引用
Comparator<Integer> com3 = Integer::compare;
int compare3 = com3.compare(15, 2);
System.out.println(compare3);
}
# Lambda表达式的使用:
1.例子:
Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
2.格式:
- -> Lambda操作符,或者箭头操作符
- -> 左边:形参列表(其实就是接口中抽象方法的形参列表)
- -> 右边: lambda体 其实就是抽象方法的方法体
3.表达式的使用(一共有6种情况):
- 语法格式一:无参,无返回值
@Test
public void test1() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("我今天吃红烧肉");
}
};
r1.run();
System.out.println("**************************");
Runnable r2 = () -> System.out.println("我今天吃饺子");
r2.run();
}
-
语法格式二:Lambda形参需要一个参数,但是没有返回值
@Test public void test3() { Consumer<String> com = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; com.accept("今天我要吃饺子"); System.out.println("**************************"); Consumer<String> com1 = (String s) -> { System.out.println(s); }; com1.accept("今天吃包子"); } -
语法格式三:数据类型可以省略,因为可以由编译器推断得出,称为"类型推断"
Consumer<String> com1 = (String s) -> { System.out.println(s); }; com1.accept("今天吃包子"); System.out.println("**************************"); Consumer<String> com2 = (s) -> { System.out.println(s); }; com2.accept("今天吃豆包");因为前面泛型定义了String类型,所以参数后面就会被编译器推断出类型,所以可以省略
-
语法格式四:若Lambda只需要一个参数时,参数的小括号可以省略
Consumer<String> com2 = (s) -> { System.out.println(s); }; com2.accept("今天吃豆包"); System.out.println("**************************"); Consumer<String> com3 = s -> { System.out.println(s); }; com2.accept("今天吃牛肉包"); -
语法格式五:Lambda 需要两个或以上的参数,多条执行语句,且可以有返回值或者没有返回值
@Test public void test4() { Comparator<Integer> com1 = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println(o1); System.out.println(o2); return Integer.compare(o1, o2); } }; int compare1 = com1.compare(1, 2); System.out.println(compare1); System.out.println("**************************"); //lambda表达式写法 Comparator<Integer> com2 = (o1, o2) -> { System.out.println(o1); System.out.println(o2); return Integer.compare(o1, o2); }; int compare2 = com2.compare(-1, 2); System.out.println(compare2); } -
语法格式六:当Lambda体只有一条语句时,return与大括号(若有),都可以省略
@Test public void test5() { Comparator<Integer> com = (o1, o2) -> { return Integer.compare(o1, o2); }; int compare = com.compare(-1, 2); System.out.println("**************************"); Comparator<Integer> com1 = (o1, o2) -> Integer.compare(o1, o2); int compare1 = com.compare(-1, 20); }
lambda表达式的本质,是作为接口的实例,所以这个类只能有一个方法,它依赖于函数式接口
总结:
左边:Lambda形参列表类型可以省略,如果lambda形参列表只有一个参数,括号可以省略
右边:lambda体应该使用{} 包裹;如果lambda体只有一条语句(可能是return语句),那么可以省略这一对{}和return 关键字,要么大括号{}不省略,