【问题标题】:Lambda expression understandmentLambda表达式理解
【发布时间】:2020-01-19 20:33:55
【问题描述】:

谁能解释一下这段代码的输出是什么以及为什么?

我真的不明白 lambda 究竟是如何工作的。

interface IntProcessor {
    int process(int i1, int i2);
}

public static void main(String[] args) {
    IntProcessor ip1 = (x,y) -> x*2 + y;
    IntProcessor ip2 = (a,b) -> a + b*2;
    int x = 3;
    int y = 7;
    x = ip1.process(x,y);
    y = ip2.process(y,x);
    System.out.println(x + ", " + y);
}   

提前致谢

【问题讨论】:

  • 所有相关代码都应该以文本形式发布在这里。另外,您要问的具体是什么?

标签: java lambda output


【解决方案1】:

Lambda 是一种提供接口实现的方法,该接口只有一个抽象方法(称为functional interface)。

给定以下接口声明

interface IntProcessor {
    int process(int input1, int input2);
}

在 Java 8 之前有两种使用方式。

一个是定义一个类并实现它。

    class MyIntProcessor implements IntProcessor {
        public int process(int a, int b) {
            return  a*a + b*b;
        }
    }

你可以这样做。

        IntProcessor ip1 = new MyIntProcessor();
        int n = ip1.process(4,5);
        System.out.println(n); // prints 41

另一种方法是创建一个匿名类

        IntProcessor ip2 = new IntProcessor() {
            public int process(int a, int b) {
               return a*a + b*b;
            }
        };

又一次。

        n = ip2.process(4,5);
        System.out.println(n); // prints 41

使用 lambda,您可以执行以下操作:

        IntProcessor ip3 = (a,b)-> a*a + b*b;
        n = ip3.process(4,5);
        System.out.println(n); // prints 41
  1. (a,b) 是参数,它们可以是任何值。
  2. -> 运算符表示 Lambda,右侧将 使用参数变量并对其进行处理。

Lambda 表达式的返回类型必须与 Functional Interface 的返回类型匹配。

编译器将负责寻找合适的接口并确保参数与其类型匹配,如果不匹配则报告错误。

【讨论】:

    【解决方案2】:

    IntProcessor 是一个接口,要实例化它,您需要定义函数,在本例中为process。

    在创建 ip1 和 ip2 时,您作为 lambda 所做的是在 fligth 上定义接口的实现,即在创建对象时定义函数。在 ip2 中(x,y) 代表函数实现的输入,这只是声明您将在主体中使用哪些变量名称的一种方式,并且对于-> 的权利,您正在定义函数的主体。

    调用ip1.process(x,y)时会返回x*2+y 调用ip2.process(x,y)时,会返回a+b*2,其中a是传递给函数的x的值,b是传递给函数的y的值

    【讨论】:

      【解决方案3】:

      您的接口IntProcessor 是一个函数式接口,因为它有一个单一抽象方法。因此,它的实现(您的ip1 和ip2)可以被视为 lambda 表达式。

      您正在即时进行实施。例如,您的ip1 可以被视为

      @Override
      int process (int input1, int input2) {
          return x*2 + y;
      }
      

      所以我认为你的代码的实际输出是13, 13 (x=3*2+7, y=7+2*3)。

      【讨论】:

      • y = 7 + 2*3?或者更好y = 7 + 2*13!
      • 啊,当然;我忘了x 被上面的那行改了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2018-04-18
      • 2010-09-19
      • 2018-09-11
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多