Lambda从一个接口调用两个函数

时间:2015-01-23 01:06:49

标签: java interface lambda

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));

1 个答案:

答案 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,但不是三元操作,因此我们需要定义自己的操作。