Java8新特性lambda学习
Lambda表达式
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
本质: 作为函数式接口的实例, 没有接口就没意义了.
// 简单使用举例
@Test
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("r1 is running...");
}
};
r1.run();
// lambda写法
Runnable r2 = () -> System.out.println("r2 is running...");
r2.run();
}
@Test
public void test2(){
Comparator<Integer> intcmp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
System.out.println(intcmp.compare(1, 2));
Comparator<Integer> intcmp2 = Integer::compare; // 方法引用
// 和intcmp2等价, 但lambda
Comparator<Integer> intcmp3 = (Integer o1, Integer o2) -> Integer.compare(o1,o2);
// 和intcmp2等价, 但lambda
Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
System.out.println(intcmp2.compare(2, 1));
System.out.println(intcmp3.compare(2, 1));
System.out.println(intcmp4.compare(2, 1));
}
这两个代码片段分别创建了匿名内部类的实例,分别用于实现Comparator<Integer>
接口和Runnable
接口。
当接口只有一个抽象方法时(函数式接口)用lambda改写会更简洁. 在实际开发中,通常更倾向于使用Lambda 表达式,因为它使代码更简洁且易读。
操作符解释以及lambda的6种语法格式
-> : lambda操作符
-> 左边: lambda形参列表, 其实就是接口中的抽象方法中的形参列表
-> 右边: lambda体, 其实就是重写的抽象方法的方法体
语法格式一: 无参, 无返回值
Runnable r2 = () -> System.out.println("r2 is running...");
语法格式二: 一个参数, 无返回值
Consumer<String> cons2 = (String s) -> System.out.println(s);
cons2.accept("cons2");
语法格式三: 数据类型可以省略, 因为可由编译器推断得出, 称为'类型推断'
Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
Consumer<String> cons2 = (s) -> System.out.println(s);
语法格式四: lambda若只需要一个参数, 参数的小括号可以省略
Consumer<String> cons2 = s -> {System.out.println(s);};
语法格式五: lambda需要两个或以上的参数, 多条执行语句, 并且可以有返回值
Comparator<Integer> intcmp5 = (o1, o2) -> {
System.out.println("intcomp5");
return Integer.compare(o1, o2);
};
System.out.println(intcmp5.compare(2, 3));
语法格式六: lambda只有一条语句, return与大括号若有, 都可以省略
Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
总结
-> 左边: lambda形参列表的参数类型可以省略(因为有类型推断); 如果lambda形参列表只有一个参数, 括号()也可以省略;
-> 右边: lambda体应该用一对{}包裹; 如果lambda体只有一条执行语句(可能是return 语句), 可以省略这一对{}和return关键字.