Java 8中的常用函数式接口
| 函数式接口 |
函数描述符 |
原始类型特化 |
| Predicate |
T->boolean |
IntPredicate, LongPredicate, DoublePredicate |
| Consumer |
T->void |
IntConsumer,LongConsumer, DoubleConsumer |
| Function<T,R> |
T->R |
IntFunction, IntToDoubleFunction, IntToLongFunction, LongFunction, LongToDoubleFunction, LongToIntFunction, DoubleFunction, ToIntFunction, ToDoubleFunction, ToLongFunction |
| Supplier |
()->T |
BooleanSupplier,IntSupplier, LongSupplier, DoubleSupplier |
| UnaryOperator |
T->T |
IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator |
| BinaryOperator |
(T,T)->T |
IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator |
| BiPredicate<L,R> |
(L,R)->boolean |
|
| BiConsumer<T,U> |
(T,U)->void |
ObjIntConsumer, ObjLongConsumer, ObjDoubleConsumer |
| BiFunction<T,U,R> |
(T,U)->R |
ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U> |
测试
对于下列函数描述符(即Lambda表达式的签名),你会使用哪些函数式接口?在上表中
可以找到大部分答案。作为进一步练习,请构造一个可以利用这些函数式接口的有效Lambda
表达式
- T->R
- (int, int)->int
- T->void
- ()->T
- (T, U)->R
答案
- Function<T,R> 它一般用于将类型T的对象转换为类型R的对象(比如Function<Apple, Integer> 用来提取苹果的重量)。
- IntBinaryOperator具有唯一一个抽象方法,叫作
applyAsInt,它代表的函数描述符是(int, int)->int。
- Consumer 具有唯一一个抽象方法叫作
accept,代表的函数描述符是T->void。
- Supplier 具有唯一一个抽象方法叫作
get,代表的函数描述符是()->T。或者,Callable<T>具有唯一一个抽象方法叫作call,代表的函数描述符是()->T。
- BiFunction<T,U,R> 具有唯一一个抽象方法叫作
apply,代表的函数描述符是(T,U)->R。
总结
| 使用案例 |
Lambda 的例子 |
对应的函数式接口 |
| 布尔表达式 |
(List list) -> list.isEmpty() |
Predicate<List> |
| 创建对象 |
() -> new Apple(10) |
Supplier |
| 消费一个对象 |
(Apple a) -> System.out.println(a.getWeight()) |
Consumer |
| 从一个对象中选择/提取 |
(String s) -> s.length() |
Function<String, Integer> 或 ToIntFunction |
| 合并两个值 |
(int a, int b) -> a * b |
IntBinaryOperator |
| 比较两个对象 |
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) |
Comparator 或 BiFunction<Apple, Apple, Integer> 或 ToIntBiFunction<Apple, Apple> |
评论