Java函数式接口入门指南
Java 8 中引入了函数式编程的支持,其中的函数式接口是重要的基础。本文将介绍Java 函数式接口的特点以及常见的函数式接口。
## 什么是函数式接口
函数式接口是只包含一个抽象方法的接口。在 Java 中,一个接口可以有多个默认方法,但只能有一个抽象方法。函数式接口重要的特点是可以支持 lambda 表达式。例如,可以用一个函数式接口实例化一个 lambda 表达式,从而简化代码。
函数式接口总是标注了 @FunctionalInterface 注解。这个注解可以确保只有一个抽象方法,而且在尝试添加新的抽象方法时会产生编译错误。
以 Supplier 接口为例,它是 Java 8 提供的一个函数式接口。Supplier 接口定义了一个函数 get(),没有输入参数但会返回一个值。实现一个 Supplier 接口的类如下所示:
public class MySupplier implements Supplier<String> {
@Override
public String get() {
return "hello";
}
}
函数式接口使得同样的类可以简化为 lambda 表达式:
Supplier<String> mySupplier = () -> "hello";
通过 @FunctionalInterface 注解,可以在编写错误的时候及时发现问题,如果一个类试图违反函数式接口的规定定义多个抽象方法,则会得到以下编译错误:
Multiple non-overriding abstract methods found in interface ...
## 常见的函数式接口
Java 8 引入了许多新的函数式接口。下表列出了常用的函数式接口。
| 接口 | 抽象方法 | 函数描述符 |
| --- | --- | --- |
| Consumer<T> | void accept(T t) | T -> void |
| Supplier<T> | T get() | () -> T |
| Function<T,R> | R apply(T t) | T -> R |
| Predicate<T> | boolean test(T t) | T -> boolean |
| BiConsumer<T,U> | void accept(T t, U u) | (T, U) -> void |
| BiFunction<T,U,R> | R apply(T t, U u) | (T, U) -> R |
### Consumer
Consumer 接口代表了一个接受单个输入的操作,并且不返回任何结果。可以使用它来表示一个操作将产生副作用,例如修改某些状态。
Consumer<String> myConsumer = (str) -> System.out.println(str);
myConsumer.accept("hello");
### Supplier
Supplier 接口代表了一个单独的输出,不接收输入参数。可以使用它来表示一个操作将仅返回一个值。
Supplier<String> mySupplier = () -> "hello"; String hello = mySupplier.get();
### Function
Function 接口代表了一个接收一个输入参数并生成一个结果的操作。
Function<String, Integer> myFunction = (str) -> str.length();
int length = myFunction.apply("hello");
### Predicate
Predicate 接口代表了一个单独的输入并生成一个布尔输出。
Predicate<String> myPredicate = (str) -> str.isEmpty();
boolean isEmpty = myPredicate.test("");
### BiConsumer
BiConsumer 接口代表了一个接受两个输入的操作,并且不返回任何结果。
BiConsumer<Integer, String> myBiConsumer = (i, str) -> System.out.println(i + str); myBiConsumer.accept(1, "hello");
### BiFunction
BiFunction 接口代表了一个接收两个输入参数并生成一个结果的操作。
BiFunction<Integer, Integer, Integer> myBiFunction = (a, b) -> a + b; int sum = myBiFunction.apply(1, 2);
## 总结
本文介绍了 Java 8 函数式接口的特点和示例。了解这些接口可以让您使用 lambda 表达式轻松编写简洁和优雅的代码。使用函数式接口和 lambda 表达式,您可以更好地利用多核处理器的优势来提高应用程序性能。
