有人能说出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
(,它将返回参数的总和。