初学者的lambda

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

1、简介:
    使用Lambda表达式可以让我们写出更短、更易读的代码。它可以替代传统的匿名类,使代码更加简洁。Lambda表达式还支持函数式编程,这意味着我们可以将函数作为参数传递给其他方法,使得代码更加灵活和可扩展。
2、基本语法
    (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
->:可明白为“被用于”的意思
方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。
详细示例:
  1. package langya.base.lambda;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. @FunctionalInterface
  6. interface OneParameterReturn {
  7.     int test(int a);
  8. }
  9. @FunctionalInterface
  10. interface MoreParameterReturn {
  11.     int test(int a, int b);
  12. }
  13. @FunctionalInterface
  14. interface NoParameterReturn {
  15.     int test();
  16. }
  17. @FunctionalInterface
  18. interface OneParameterNoReturn {
  19.     void test(int a);
  20. }
  21. @FunctionalInterface
  22. interface MoreParameterNoReturn {
  23.     void test(int a, int b);
  24. }
  25. @FunctionalInterface
  26. interface NoParameterNoReturn {
  27.     void test();
  28. }
  29. @FunctionalInterface
  30. interface MyFunction {
  31.     void printValue();
  32. }
  33. public class Lambda {
  34.     public void lambdaTest() {
  35.         List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
  36.         System.out.println("单个表达式的lambad");
  37.         numbers.forEach(number -> System.out.println(number));
  38.         List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)) ;
  39.         System.out.println("为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。");
  40.         System.out.println("原始list:"+list);
  41.         list.removeIf(n -> n % 2 == 0);
  42.         System.out.println("修改后list:"+list);
  43.         System.out.println("多个语句的lambad");
  44.         numbers.forEach(number -> {
  45.             int dd = number * 2;
  46.             System.out.println("number:" + number + "  " + "dd:" + dd);
  47.         });
  48.         System.out.println("有返回值一个参数的函数式接口");
  49.         OneParameterReturn oneParameterReturn = (int a) -> {
  50.             System.out.println("有返回值有一个参数!");
  51.             a = a * 2;
  52.             return a;
  53.         };
  54.         int ret = oneParameterReturn.test(5);
  55.         System.out.println(ret);
  56.         System.out.println("有返回值多个参数的函数式接口");
  57.         MoreParameterReturn moreParameterReturn = (int a, int b) -> {
  58.             System.out.println("有返回值多个参数!");
  59.             return a + b;
  60.         };
  61.         int ret2 = moreParameterReturn.test(5, 2);
  62.         System.out.println("a+b=" + ret2);
  63.         System.out.println("无参数无返回值");
  64.         NoParameterReturn noParameterReturn = () -> {
  65.             System.out.println("无参数无返回值");
  66.             return 1;
  67.         };
  68.         int a = noParameterReturn.test();
  69.         System.out.println("a:" + a);
  70.         System.out.println("一个参数无返回值的函数式接口");
  71.         OneParameterNoReturn oneParameterNoReturn = (int d) -> {
  72.             System.out.println("一个参数无返回值的函数式接口,参数d的值为:" + d);
  73.         };
  74.         oneParameterNoReturn.test(20);
  75.         System.out.println("多个参数无返回值的函数式接口");
  76.         MoreParameterNoReturn moreParameterNoReturn = (int c, int b) -> {
  77.             System.out.println("多个参数无返回值的函数式接口,参数c的值为:" + c + ",参数b的值为:" + b);
  78.         };
  79.         moreParameterNoReturn.test(1, 2);
  80.         System.out.println("无参无返回值");
  81.         NoParameterNoReturn noParameterNoReturn = () -> {
  82.             System.out.println("无参无返回值");
  83.         };
  84.         noParameterNoReturn.test();
  85.         System.out.println("匿名内部类变量捕获");
  86.         final int x = 10;
  87.         MyFunction myFunction = new MyFunction() {
  88.             @Override
  89.             public void printValue() {
  90.                 System.out.println("x:" + x);
  91.             }
  92.         };
  93.         myFunction.printValue();
  94.     }
  95. }
复制代码
运行结果为:
  1. 单个表达式的lambad
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。
  11. 原始list:[1, 2, 3, 4, 5, 6, 7, 8]
  12. 修改后list:[1, 3, 5, 7]
  13. 多个语句的lambad
  14. number:1  dd:2
  15. number:2  dd:4
  16. number:3  dd:6
  17. number:4  dd:8
  18. number:5  dd:10
  19. number:6  dd:12
  20. number:7  dd:14
  21. number:8  dd:16
  22. 有返回值一个参数的函数式接口
  23. 有返回值有一个参数!
  24. 10
  25. 有返回值多个参数的函数式接口
  26. 有返回值多个参数!
  27. a+b=7
  28. 无参数无返回值
  29. 无参数无返回值
  30. a:1
  31. 一个参数无返回值的函数式接口
  32. 一个参数无返回值的函数式接口,参数d的值为:20
  33. 多个参数无返回值的函数式接口
  34. 多个参数无返回值的函数式接口,参数c的值为:1,参数b的值为:2
  35. 无参无返回值
  36. 无参无返回值
  37. 匿名内部类变量捕获
  38. x:10
复制代码
4、总结
Lambda 表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
优点:

  • 代码简洁,开辟迅速
  • 方便函数式编程
  • 非常容易进行并行盘算
  • Java 引入 Lambda,改善了集合操纵
缺点

  • 代码可读性变差
  • 在非并行盘算中,很多盘算未必有传统的 for 性能要高
  • 不容易进行调试

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

美食家大橙子

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

标签云

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