Aru*_*mar 5 java java-8 functional-interface
我知道函数式接口意味着您可以完全/只有 1 个抽象方法和 1 个以上的默认方法,但我想知道如何将它与在 Java 中使用函数式接口的实际示例/情况相关联。
你能给出一个有效的情况/例子吗?
提前致谢!
首先注解@FunctionalInterface被 Java 的内置函数接口Predicate, Function, Consumer, 等使用...
另一方面,您可能希望创建自定义的,如下所示:
@FunctionalInterface
public interface ThrowingConsumer<T> {
void accept(T t) throws CustomException;
}
Run Code Online (Sandbox Code Playgroud)
然后您可以将其用作方法参数:
public <T, R> void doSomething(T value, ThrowingConsumer<T, R> consumer) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它:
doSomething(someValue, this::customConsumerMethodThrowingAnException);
Run Code Online (Sandbox Code Playgroud)
值得一提的@FunctionalInterface是,这不是必需的。编译器对于满足要求的任何接口都完全没问题。
编译器以类似于处理@Override注解的方式处理它。即使没有它,代码也能编译。但是一旦添加,它会使代码对将来维护代码的人更清晰、更安全。
在 JDK8 之前我们一直有函数式接口,但没有 lambda、方法引用等。
从 JDK8 开始,它们为 lambda 表达式、方法引用提供了目标类型,从而具有更好的可读性和更紧凑的代码。
Button例如,在 Java-8 之前,如果您想提供一些在每次单击组件时执行的逻辑,您可以这样做:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
Run Code Online (Sandbox Code Playgroud)
它体积庞大、难以阅读并且不够紧凑。因为EventHandler根据定义,它是一个功能接口,即它具有SAM从 jdk8 开始的功能,您现在可以执行以下操作:
btn.setOnAction(event -> System.out.println("Hello World!"));
Run Code Online (Sandbox Code Playgroud)
您只能看到您关心的代码部分,即单击按钮时要执行的逻辑。
此外,由于我们可以使用函数式接口作为 lambda 表达式和方法引用的目标类型,因此这在以下情况下会很有用:
List.sort等。Stream.sortedCollections.sortETC...
同时保持代码的可读性、紧凑性和简洁性。
函数式接口在 Java-stream API 中被广泛使用。
您没有理由创建自己的函数式接口,除非没有满足您的要求的函数式接口,java.util.function或者函数式接口的名称不那么可读,因此您可以创建自己的函数式接口。
当您创建函数式接口时,还有一个@FunctionalInterface建议使用但不是必需的注释(标准库经常使用它)。
这使得编译器能够检查带注释的实体是否是具有单个抽象方法的接口,否则会给出错误。
这对于在重构代码时捕获错误也非常有帮助。
小智 1
标记为 的接口FunctionalInterface保证适用于需要具有适当参数和返回类型的 lambda 表达式的上下文。除此之外,它们没有任何用途。可能会有一些优化,但在所有情况下都没关系
| 归档时间: |
|
| 查看次数: |
5592 次 |
| 最近记录: |