interface MathOperation{
int operation1(int a, int b);
int operation2(int c, int d, int e);
}
public static int operate1(int a, int b, MathOperation mathOperation){
return mathOperation.operation1(a, b);
}
public static int operate2(int a, int b, int c, MathOperation mathOperation){
return mathOperation.operation2(a, b, c);
}
为什么以下代码不起作用?
System.out.println("5 - 3 = " + operate1(5, 3, (a,b)->a-b));
System.out.println("5 + 3 + 4 = " + operate2(5, 3, 4, (a,b,c)->a+b+c));
答案 0 :(得分:3)
JLS 9.8说(转述):
功能接口是一个只有一个抽象方法的接口。可以使用lambda表达式创建功能接口的实例。
由于MathOperation
有多个方法,因此无法使用lambda表达式创建它。
为什么不能呢?好吧,因为如果我们这样做了:
operate2( 1, 2, 3, ( (a, b) -> a + b ) );
应该怎么办,因为我们没有提供operation2
的定义?
使用@FunctionalInterface
注释会警告您这一点,类似于@Override
注释的工作方式:
/* causes a compilation error because
MathOperation is not a functional interface */
@FunctionalInterface
interface MathOperation {
int operation1(int a, int b);
int operation2(int c, int d, int e);
}
示例代码的更规范定义是:
@FunctionalInterface
public interface IntTernaryOperator {
int applyAsInt(int a, int b, int c);
}
public static int operate1(
int a, int b,
IntBinaryOperator op
) {
return op.applyAsInt(a, b);
}
public static int operate2(
int a, int b, int c,
IntTernaryOperator op
) {
return op.applyAsInt(a, b, c);
}
JSE提供二进制int操作java.util.function.IntBinaryOperator
,但不是三元操作,因此我们需要定义自己的操作。