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