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> |
评论