为什么Java8中的Functional Interface中没有多个抽象方法?

时间:2017-08-02 16:31:17

标签: java lambda

@FunctionalInterface
interface MyLambda {
    void apply1();
    int apply2(int x, int y);
}

现在使用Lambda表达式为什么Java不能允许两个以下,因为它明确区分了两者:

MyLambda ml1 = () -> System.out.println("Hello");
MyLambda ml2 = (x, y) -> x+y;

3 个答案:

答案 0 :(得分:3)

答案是,为了创建一个有效的实现,你需要能够同时传递N个lambdas,这会引入很多歧义并且可读性大大降低。

另一个问题是@FunctionalInterface用于表示可用作lambda表达式的目标的接口,而lambda是SINGLE函数。

无论如何,你的例子是无效的,不会编译,因为它试图在功能界面上创建两个不完整的实现。

答案 1 :(得分:1)

  

功能界面是一个只有一个抽象的界面   方法(除了Object的方法),从而代表一个   单一功能合同。这个"单身"方法可以采取的形式   具有覆盖等效签名的多个抽象方法   继承自超级接口;在这种情况下,继承的方法   逻辑上代表一种方法。

     

https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8

答案 2 :(得分:1)

编写Lamba表达式意味着我们正在实现作为功能接口的接口。它应该有一个抽象方法,因为在lambda表达式时,我们一次只能提供一个实现。 所以在问题中发布的代码片段中,我们在任何时候只给出一个实现,同时声明Lambda,我们必须为两个抽象方法实现。

感谢您的帮助。