美食家大橙子 发表于 2024-11-13 15:39:31

初学者的lambda

1、简介:
    使用Lambda表达式可以让我们写出更短、更易读的代码。它可以替代传统的匿名类,使代码更加简洁。Lambda表达式还支持函数式编程,这意味着我们可以将函数作为参数传递给其他方法,使得代码更加灵活和可扩展。
2、基本语法
    (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
->:可明白为“被用于”的意思
方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。
详细示例:
package langya.base.lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

@FunctionalInterface
interface MoreParameterReturn {
    int test(int a, int b);
}

@FunctionalInterface
interface NoParameterReturn {
    int test();
}

@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}

@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a, int b);
}

@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}

@FunctionalInterface
interface MyFunction {
    void printValue();
}

public class Lambda {

    public void lambdaTest() {
      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

      System.out.println("单个表达式的lambad");
      numbers.forEach(number -> System.out.println(number));

      List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)) ;
      System.out.println("为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。");
      System.out.println("原始list:"+list);
      list.removeIf(n -> n % 2 == 0);
      System.out.println("修改后list:"+list);

      System.out.println("多个语句的lambad");
      numbers.forEach(number -> {
            int dd = number * 2;
            System.out.println("number:" + number + "" + "dd:" + dd);
      });

      System.out.println("有返回值一个参数的函数式接口");
      OneParameterReturn oneParameterReturn = (int a) -> {
            System.out.println("有返回值有一个参数!");
            a = a * 2;
            return a;
      };
      int ret = oneParameterReturn.test(5);
      System.out.println(ret);

      System.out.println("有返回值多个参数的函数式接口");
      MoreParameterReturn moreParameterReturn = (int a, int b) -> {
            System.out.println("有返回值多个参数!");
            return a + b;
      };
      int ret2 = moreParameterReturn.test(5, 2);
      System.out.println("a+b=" + ret2);

      System.out.println("无参数无返回值");
      NoParameterReturn noParameterReturn = () -> {
            System.out.println("无参数无返回值");
            return 1;
      };
      int a = noParameterReturn.test();
      System.out.println("a:" + a);

      System.out.println("一个参数无返回值的函数式接口");
      OneParameterNoReturn oneParameterNoReturn = (int d) -> {
            System.out.println("一个参数无返回值的函数式接口,参数d的值为:" + d);
      };
      oneParameterNoReturn.test(20);

      System.out.println("多个参数无返回值的函数式接口");
      MoreParameterNoReturn moreParameterNoReturn = (int c, int b) -> {
            System.out.println("多个参数无返回值的函数式接口,参数c的值为:" + c + ",参数b的值为:" + b);
      };
      moreParameterNoReturn.test(1, 2);

      System.out.println("无参无返回值");
      NoParameterNoReturn noParameterNoReturn = () -> {
            System.out.println("无参无返回值");
      };
      noParameterNoReturn.test();

      System.out.println("匿名内部类变量捕获");
      final int x = 10;
      MyFunction myFunction = new MyFunction() {
            @Override
            public void printValue() {
                System.out.println("x:" + x);
            }
      };
      myFunction.printValue();
    }
}运行结果为:
单个表达式的lambad
1
2
3
4
5
6
7
8
为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。
原始list:
修改后list:
多个语句的lambad
number:1dd:2
number:2dd:4
number:3dd:6
number:4dd:8
number:5dd:10
number:6dd:12
number:7dd:14
number:8dd:16
有返回值一个参数的函数式接口
有返回值有一个参数!
10
有返回值多个参数的函数式接口
有返回值多个参数!
a+b=7
无参数无返回值
无参数无返回值
a:1
一个参数无返回值的函数式接口
一个参数无返回值的函数式接口,参数d的值为:20
多个参数无返回值的函数式接口
多个参数无返回值的函数式接口,参数c的值为:1,参数b的值为:2
无参无返回值
无参无返回值
匿名内部类变量捕获
x:104、总结
Lambda 表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
优点:

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

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

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