【发布时间】:2017-05-27 21:32:41
【问题描述】:
我正在努力学习 Lambda 表达式,
interface MathOperartor 为 int 和 float 类型重载了 operation(),我确信使用 Lambda 表达式应该可以做到这一点,但似乎无法弄清楚这里的问题是什么:
public static void main(String[] args) {
LambdaLearning lb = new LambdaLearning();
MathOperartor add = (a , b )-> a + b; // error: The target type of this expression must be a functional interface
MathOperartor sub = (a , b) -> a - b; // same error
MathOperartor mul = (a , b) -> a * b; // ''
MathOperartor div = (a , b) -> a / b; // ''
System.out.println(lb.operate(10, 15, add));
System.out.println(lb.operate(10.5f, 15.5f, sub));
System.out.println(lb.operate(10, 15, mul));
System.out.println(lb.operate(10, 15, div));
}
interface MathOperartor{
public Object operate(int a, int b);
public Object operate(float a, float b);
}
private Object operate(int a, int b, MathOperartor math){
return math.operate(a,b);
}
private Object operate(float a, float b, MathOperartor math){
return math.operate(a,b);
}
请让我知道我在这里做错了什么并提出修复建议...
更新:
好的,所以我理解了功能接口的概念,我的问题也是关于在上面的代码中实现我想要做的事情,我找到了几种方法来做到这一点。
感谢大家的宝贵回答!
【问题讨论】:
-
你需要在那个接口中只有一个抽象方法,寻找功能接口。
-
"这个表达式的目标类型必须是函数式接口" => 嗯...
MathOperartor类型不是functional interface。 -
扩大类型转换可以由JVM自动完成,不需要两种方法来操作。一个函数式接口可以有一个抽象方法。