我在 Java 8 中遇到了一个新术语:“函数式接口”。 在使用lambda 表达式 时,我只能找到它的一种用途。
Java 8 提供了一些内置的功能接口,如果我们想定义任何功能接口,那么我们可以使用@FunctionalInterface注解。它将允许我们在接口中只声明一个方法。
@FunctionalInterface
例如:
@FunctionalInterface interface MathOperation { int operation(int a, int b); }
除了使用lambda 表达式 之外,它在 Java 8 中还有多大用处?
@FunctionalInterface注释对于代码的编译时间检查很有用。static除了 之外,您不能拥有多个方法,default以及覆盖Object您@FunctionalInterface或任何其他用作功能接口的接口中的方法的抽象方法。
static
default
Object
但是您可以使用没有此注释的 lambda,也可以覆盖没有@Override注释的方法。
@Override
来自文档
函数式接口只有一个抽象方法。由于默认方法有一个实现,它们不是抽象的。如果一个接口声明了一个覆盖 java.lang.Object 的公共方法之一的抽象方法,这也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自 java.lang.Object 或其他地方的实现
这 可以 在 lambda 表达式中使用:
public interface Foo { public void doSomething(); }
这 不能 在 lambda 表达式中使用:
public interface Foo { public void doSomething(); public void doSomethingElse(); }
但这会产生 编译错误 :
@FunctionalInterface public interface Foo { public void doSomething(); public void doSomethingElse(); }
‘@FunctionalInterface’ 注释无效;Foo 不是函数式接口