Java8新特性lambda学习

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
本质: 作为函数式接口的实例, 没有接口就没意义了.
  1.     // 简单使用举例
  2.     @Test
  3.     public void test1(){
  4.         Runnable r1 = new Runnable() {
  5.             @Override
  6.             public void run() {
  7.                 System.out.println("r1 is running...");
  8.             }
  9.         };
  10.         r1.run();
  11.         // lambda写法
  12.         Runnable r2 = () -> System.out.println("r2 is running...");
  13.         r2.run();
  14.     }
  15.     @Test
  16.     public void test2(){
  17.         Comparator<Integer> intcmp = new Comparator<Integer>() {
  18.             @Override
  19.             public int compare(Integer o1, Integer o2) {
  20.                 return Integer.compare(o1, o2);
  21.             }
  22.         };
  23.         System.out.println(intcmp.compare(1, 2));
  24.         Comparator<Integer> intcmp2 = Integer::compare; // 方法引用
  25.         // 和intcmp2等价, 但lambda
  26.         Comparator<Integer> intcmp3 = (Integer o1, Integer o2) -> Integer.compare(o1,o2);
  27.         // 和intcmp2等价, 但lambda
  28.         Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
  29.         System.out.println(intcmp2.compare(2, 1));
  30.         System.out.println(intcmp3.compare(2, 1));
  31.         System.out.println(intcmp4.compare(2, 1));
  32.     }
复制代码
这两个代码片段分别创建了匿名内部类的实例,分别用于实现Comparator接口和Runnable接口。
当接口只有一个抽象方法时(函数式接口)用lambda改写会更简洁. 在实际开发中,通常更倾向于使用Lambda 表达式,因为它使代码更简洁且易读。
操作符解释以及lambda的6种语法格式

-> : lambda操作符
-> 左边: lambda形参列表, 其实就是接口中的抽象方法中的形参列表
-> 右边: lambda体, 其实就是重写的抽象方法的方法体
语法格式一: 无参, 无返回值
  1. Runnable r2 = () -> System.out.println("r2 is running...");
复制代码
语法格式二: 一个参数, 无返回值
  1. Consumer<String> cons2 = (String s) -> System.out.println(s);
  2. cons2.accept("cons2");
复制代码
语法格式三: 数据类型可以省略, 因为可由编译器推断得出, 称为'类型推断'
  1. Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
  2. Consumer<String> cons2 = (s) -> System.out.println(s);
复制代码
语法格式四: lambda若只需要一个参数, 参数的小括号可以省略
  1. Consumer<String> cons2 = s -> {System.out.println(s);};
复制代码
语法格式五: lambda需要两个或以上的参数, 多条执行语句, 并且可以有返回值
  1. Comparator<Integer> intcmp5 = (o1, o2) -> {
  2.     System.out.println("intcomp5");
  3.     return Integer.compare(o1, o2);
  4. };
  5. System.out.println(intcmp5.compare(2, 3));
复制代码
语法格式六: lambda只有一条语句, return与大括号若有, 都可以省略
  1. Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
复制代码
总结

-> 左边: lambda形参列表的参数类型可以省略(因为有类型推断); 如果lambda形参列表只有一个参数, 括号()也可以省略;
-> 右边: lambda体应该用一对{}包裹; 如果lambda体只有一条执行语句(可能是return 语句), 可以省略这一对{}和return关键字.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表