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接口和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关键字.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |