如何在Java8中使用lambda表达式以及什么是use lambda表达式



有人能说出lambda表达式在Java8中的用法吗?

我已经尝试了下面的代码,但无法获得程序的含义:

public static void main(String[] args) {
  state s = new state();
  MathOperation addition = (a, b) -> a + b;
  System.out.println(s.operate(10.1, 5.2, addition));
}
interface MathOperation {
  double operation(double a, double b);
}
private static double operate(double a, double b, MathOperation mo) {
  return mo.operation(a, b);
}

Lambda表达式可以用于只需要一个方法实现的接口实例的情况。在这种情况下,

MathOperation addition = ...

...部分需要一个与MathOperation兼容的值。但是我们很懒,对吧?我们不想仅仅为这样简单的东西创建一个类:

class Addition implements MathOperation {
    public double operation(double a, double b) {
        return a + b;
    }
}
// usage:
MathOperation addition = new Addition();

太长了!

然后是匿名类,但它们也有点冗长:

MathOperation addition = new MathOperation() {
    public double operation(double a, double b) {
        return a + b;
    }
}

如果您使用lambda表达式,您的代码将更加干净:

MathOperation addition = (a, b) -> a + b;

(a, b)部分指定参数的名称。而->的右侧是接口方法的实际实现。如果是表达式,则会隐式添加return关键字。多好啊!

"等一下!参数的类型在哪里?"你问道。好吧,因为所有的东西都可以从接口中推断出来,所以没有必要显式指定类型!

现在您有一个名为addition的变量,它存储接口MathOperation的实现。实现简单地说就是return a + b

现在,我认为您可以自己理解其余的代码。

程序只计算两个参数的总和。在您的情况下,10.1+5.2

BTW:阅读Java命名约定。类名应该以大写字母开头

基本上,这个语句:

MathOperation addition = (a, b) -> a+b;

将CCD_ 9分配给CCD_。这个类实现了operation方法;该实现添加了两个参数。类似的东西

class SomeAnonymousClass implements MathOperation {
    @Override
    public double operation(double a, double b) {
        return a + b;
    }
}

因此,当对此类的对象使用operation方法时(如示例中的mo.operation(,它将返回参数的总和。

最新更新