Java 8 中使用的功能接口是什么?

新手上路,请多包涵

我在 Java 8 中遇到了一个新术语:“函数式接口”。在使用 lambda 表达式 时,我只能找到它的一种用途。

Java 8 提供了一些内置的功能接口,如果我们想定义任何功能接口,我们可以使用 @FunctionalInterface 注释。它将允许我们在接口中只声明一个方法。

例如:

 @FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

除了使用 lambda 表达式 之外,它在 Java 8 中还有多大用处?

这里 的问题与我提出的问题不同。它问为什么我们在使用 lambda 表达式时需要函数式接口。我的问题是:除了使用 lambda 表达式之外,函数式接口的其他用途是什么?)

原文由 Madhusudan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
2 个回答

@FunctionalInterface 注释对于代码的编译时间检查很有用。 You cannot have more than one method besides static , default and abstract methods that override methods in Object in your @FunctionalInterface or any other interface用作功能接口。

但是您可以使用没有此注释的 lambda,也可以覆盖没有 @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 不是函数式接口

原文由 Sergii Bishyr 发布,翻译遵循 CC BY-SA 3.0 许可协议

文档 确实在目的之间有所不同

一种信息性注释类型,用于指示接口类型声明旨在成为 Java 语言规范定义的 _功能接口_。

和用例

请注意,功能接口的实例可以使用 lambda 表达式、方法引用或构造函数引用来创建。

其措辞一般不排除其他用例。由于主要目的是指示 _功能接口_,因此您的实际问题归结为“ 除了 lambda 表达式和方法/构造函数引用之外 ,功能接口还有其他用例 吗?”

由于 功能接口 是由 Java 语言规范定义的 Java 语言构造,因此只有该规范可以回答该问题:

JLS §9.8。功能接口

……

除了通过声明和实例化类(第 15.9 节)创建接口实例的通常过程之外,还可以使用方法引用表达式和 lambda 表达式(第 15.13 节、第 15.27 节)创建功能接口的实例。

因此 Java 语言规范没有另外说明,该部分中提到的唯一用例是使用方法引用表达式和 lambda 表达式创建接口实例。 (这包括构造函数引用,因为它们在规范中被称为方法引用表达式的一种形式)。

所以一句话,不,在 Java 8 中没有其他用例。

原文由 Holger 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题