Dim*_*San 5 java lambda java-8
众所周知,Java 8 向 Java 开发人员引入了函数式编程。
Comparator、Runnable、Callable等接口是功能性的。
从定义如下:功能接口是只有一个抽象方法的接口。
但是例如同一个接口Comparator有多个抽象方法:
int compare(T o1, T o2);
boolean equals(Object obj); // inherited from Object class
// and a lot of concrete methods more
Run Code Online (Sandbox Code Playgroud)
那么,是否有任何严格的规则来确定接口是否是函数式的,以便它可以用作 lambda 表达式或方法引用的赋值目标?
来自JLS §9.8(突出显示我的):
函数式接口是只有一个抽象方法的接口(除了 Object 的方法)
理由是
要使用该接口,您必须实例化它。每个实例化都必然继承自Object,因此无论如何都实现了这些抽象方法。
另一种方法 -
boolean equals(Object)- 是抽象方法的显式声明,否则该方法将被隐式声明,并且将由实现该接口的每个类自动实现。
作为函数式接口,您不太可能想要调用由Object. 因此,这些方法在搜索要调用的方法时不计算在内(因为函数接口的方法可以在不命名该方法的情况下调用)。
这是为了允许对接口进行功能处理,例如
java.util.Comparator<T>声明多个抽象方法,其中只有一个是真正“新的” -int compare(T,T)。