一言以蔽之,函数式接口就是只定义一个抽象方法的接口。例如Comparator(只有一个方法compare)和Runnable(只有一个方法run)都是函数式接口。
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫做函数描述符。例如,Runnable接口可以看作一个什么也不接受也不返回(void)的函数的签名,因为它只有一个叫做run的抽象方法,这个方法什么也不接受,什么也不返回(void)。我们可以用一种特殊表示法来描述Lambda和函数式接口的签名。() -> void 代表了参数列表为空,且返回void的函数。
函数式接口定义且只定义了一个抽象方法。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。函数式接口的抽象方法的签名成为函数描述符。所以为了应用不同的Lambda表达式,你需要一套能够描述常见函数描述符的函数式接口。Java API中已经有了几个函数式接口,比如Comparator、Runnable和Callable。
Java8中的常用函数式接口:
函数式接口 | 函数描述符 |
---|---|
Predicate<T> | T -> boolean |
Consumer<T> | T -> void |
Function<T, R> | T -> R |
Supplier<T> | () -> T |
UnaryOperator<T> | T -> T |
BinaryOperator<T> | (T, T) -> T |
BiPredicate<L, R> | (L, R) -> boolean |
BiConsumer<T, U> | (T, U) -> void |
BiFunction<T, U, R> | (T, U) -> R |