Bal*_*alu 2 java lambda java-8
我正在尝试学习Lambda表达式,
interface MathOperartor 我已经确定使用Lambda表达式可以做到的操作()重载了,我确实可以使用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);
}
Run Code Online (Sandbox Code Playgroud)
请让我知道我在这里做错了什么,并建议修复......
更新:
好的,所以我理解了功能界面的概念,我的问题也是关于实现我在上面的代码中尝试做的事情,我发现了几种方法.
谢谢大家的宝贵答案!
甲功能接口必须是一个SAM接口:
功能界面只有一个抽象方法.由于默认方法具有实现,因此它们不是抽象的.如果接口声明了一个覆盖java.lang.Object的公共方法之一的抽象方法,那么它也不会计入接口的抽象方法计数,因为接口的任何实现都将具有java.lang.Object或其他地方的实现.
你的接口声明了2个抽象方法,lambda表达式不知道去哪里,lambda表达式是该接口的一个实例,这意味着必须实现接口中声明的所有抽象方法.但是你可以在这种情况下添加默认方法来解决你的问题,例如:
interface MathOperartor{
//it also can be removed, since a int can cast to a float automatically
default Object operate(int a, int b){
return operate((float)a, (float)b);
}
public Object operate(float a, float b);
}
Run Code Online (Sandbox Code Playgroud)