有人能说出在Java 8中使用lambda表达式吗?
我已经尝试过以下代码,无法理解程序的含义:
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);
}
答案 0 :(得分:1)
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
。
现在我认为您可以自己理解其余的代码。
答案 1 :(得分:0)
程序仅计算两个参数的总和。 在您的情况下10.1 + 5.2
BTW:了解Java命名约定。类名应以大写字母开头
答案 2 :(得分:0)
基本上,这句话:
MathOperation addition = (a, b) -> a+b;
将addition
分配给implements MathOperation
的新匿名类的对象。该类实现operation
方法;该实现添加了两个参数。像
class SomeAnonymousClass implements MathOperation {
@Override
public double operation(double a, double b) {
return a + b;
}
}
因此,当operation
方法用于此类的对象(如示例中的mo.operation
)时,它将返回参数的总和。