我知道函数式接口指的是只能有一个抽象方法,但可以有多个默认方法,但我想知道如何用Java中的函数式接口举一个现实世界的例子/情境。
你能给我一个有效的情况/示例吗?
谢谢!
我知道函数式接口指的是只能有一个抽象方法,但可以有多个默认方法,但我想知道如何用Java中的函数式接口举一个现实世界的例子/情境。
你能给我一个有效的情况/示例吗?
谢谢!
首先,Java内置的函数式接口 Predicate
、Function
、Consumer
等都使用了注解 @FunctionalInterface
。
另一方面,您可能想创建自定义的函数式接口,如下所示:
@FunctionalInterface
public interface ThrowingConsumer<T> {
void accept(T t) throws CustomException;
}
然后您可以将其用作方法参数:
public <T, R> void doSomething(T value, ThrowingConsumer<T, R> consumer) {
// ...
}
然后像这样调用它:
doSomething(someValue, this::customConsumerMethodThrowingAnException);
值得一提的是,@FunctionalInterface
不是必须的。编译器可以接受任何符合要求的接口。
编译器处理它的方式类似于处理 @Override
注解。即使没有它,代码也可以编译。但一旦添加了它,将使代码更清晰、更安全,方便未来维护代码的人员。
@FunctionalInterface
并非必需,但只是为了防止将 SMIs 用作 lambda 时添加方法而破坏接口兼容性。否则,此答案仅涉及 SMIs - 而不涉及 @FunctionalInterface
... - Boris the SpiderJDK8之前我们已经有了函数式接口,但没有 lambda 表达式、方法引用等功能。
从 JDK8 开始,它们为 lambda 表达式和方法引用提供了目标类型,从而使代码更易读,更紧凑。
例如,在 Java-8 之前,如果您想要提供一些逻辑,每次单击 Button
组件时都会执行:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
这篇文章看起来臃肿、难以阅读且不够紧凑。因为EventHandler
是一个函数式接口,也就是说它有一个单一抽象方法(SAM
)。从 JDK8 开始,你可以这样写:
btn.setOnAction(event -> System.out.println("Hello World!"));
他们提供的主要用途之一是可以使用lambda表达式和方法引用创建功能接口的实例,同时还可以使用构造函数。例如,定义为Sample
的功能接口:
@FunctionalInterface
public interface Sample {
void ab();
}
Sample sample = () -> System.out.println("ab called");
然后在需要的地方调用:
sample.ab();
我将引用来自java.util.function
包的Javadoc:
此外,这样的接口可以用Functional interfaces can provide a target type in multiple contexts, such as assignment context, method invocation, or cast context:
// Assignment context Predicate<String> p = String::isEmpty; // Method invocation context stream.filter(e -> e.getSize() > 10)... // Cast context stream.map((ToIntFunction) e -> e.getSize())...
@FunctionalInterface
注解进行说明。
此外,对于现有的这些接口使用这些概念也是值得注意的,该注解不是编译器将接口识别为函数式接口的要求,而仅仅是一种捕捉设计意图并在识别设计意图发生意外违规时请求编译器帮助的辅助手段。
FunctionalInterface
注解。被标记为FunctionalInterface
的接口在期望具有适当参数和返回类型的lambda表达式的上下文中保证可用。除此之外,它们没有任何用处。可能会有一些优化,但在所有情况下都不重要。