表3-1 Java 8中的常用函数式接口
函数式接口 |
函数描述符 |
原始类型特化 |
Predicate<T> |
T->boolean |
IntPredicate,LongPredicate, DoublePredicate |
Consumer<T> |
T->void |
IntConsumer,LongConsumer, DoubleConsumer |
Function<T,R> |
T->R |
IntFunction<R>, |
|
IntToDoubleFunction, |
|
IntToLongFunction, |
||
LongFunction<R>, |
||
LongToDoubleFunction, |
||
LongToIntFunction, |
||
DoubleFunction<R>, |
||
ToIntFunction<T>, |
||
ToDoubleFunction<T>, |
||
ToLongFunction<T> |
||
Supplier<T> | ()->T | BooleanSupplier,IntSupplier, LongSupplier, |
DoubleSupplier | ||
UnaryOperator<T> | T->T | IntUnaryOperator |
LongUnaryOperator | ||
DoubleUnaryOperator | ||
BinaryOperator<T> | ( T,T)->T | IntBinaryOperator |
LongBinaryOperator | ||
DoubleBinaryOperator | ||
BiPredicate<L,R> | (L,R)->boolean | |
BiConsumer<T,U> | (T,U)->void | ObjIntConsumer<T> |
ObjLongConsumer<T> | ||
ObjDoubleConsumer<T> | ||
BiFunction<T,U,R> | (T,U)->R | ToIntBiFunction<T,U> |
ToLongBiFunction<T,U> | ||
ToDoubleBiFunction<T,U> |
表3-2 Java 8中间操作和终端操作
操 作 |
类 型 |
返回类型 |
使用的类型/函数式接口 |
函数描述符 |
filter |
中间 |
Stream<T> |
Predicate<T> |
T -> boolean |
distinct |
中间 (有状态-无界) |
Stream<T> |
|
|
skip |
中间 (有状态-有界) |
Stream<T> |
long |
|
limit
map |
中间 (有状态-有界) 中间 |
Stream<T>
Stream<R> |
long
Function<T, R> |
T -> R |
flatMap |
中间 |
Stream<R> |
Function<T, Stream<R>> |
T -> Stream<R> |
sorted
anyMatch |
中间 (有状态-无界) 终端 |
Stream<T>
boolean |
Comparator<T>
Predicate<T> |
(T, T) -> int
T -> boolean |
noneMatch |
终端 |
boolean |
Predicate<T> |
T -> boolean |
allMatch |
终端 |
boolean |
Predicate<T> |
T -> boolean |
findAny |
终端 |
Optional<T> |
|
|
findFirst |
终端 |
Optional<T> |
|
|
forEach |
终端 |
void |
Consumer<T> |
T -> void |
collect |
终端 |
R |
Collector<T, A, R> |
|
reduce |
终端 (有状态-有界) |
Optional<T> |
BinaryOperator<T> |
(T, T) -> T |
count |
终端 |
long |
|
|
表3-3 Java 8中的Collectors类的静态工厂方法表
工厂方法 |
返回类型 |
用 于 |
toList |
List<T> |
把流中所有项目收集到一个 List |
使用示例:List<Dish> dishes =
menuStream.collect(toList());
toSet |
Set<T> |
把流中所有项目收集到一个 Set,删除重复项 |
使用示例:Set<Dish> dishes =
menuStream.collect(toSet());
toCollection |
Collection<T> |
把流中所有项目收集到给定的供应源创建的集合 |
使用示例:Collection<Dish> dishes =
menuStream.collect(toCollection(),ArrayList::new);
Long | counting | 计算流中元素的个数 |
使用示例:long howManyDishes =
menuStream.collect(counting());
summingInt |
Integer |
对流中项目的一个整数属性求和 |
使用示例:int totalCalories =
menuStream.collect(summingInt(Dish::getCalories));
averagingInt |
Double |
计算流中项目 Integer 属性的平均值 |
使用示例:double avgCalories =
menuStream.collect(averagingInt(Dish::getCalories));
summarizingInt |
IntSummaryStatistics |
收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值 |
使用示例:IntSummaryStatistics menuStatistics =
menuStream.collect(summarizingInt(Dish::getCalories));
joining` |
String |
连接对流中每个项目调用 toString 方法所生成的字符串 |
使用示例:String shortMenu =
menuStream.map(Dish::getName).collect(joining(", "));
maxBy |
Optional<T> |
一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty() |
使用示例:Optional<Dish> fattest =
menuStream.collect(maxBy(comparingInt(Dish::getCalories)));
minBy |
Optional<T> |
一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty() |
使用示例:Optional<Dish> lightest =
menuStream.collect(minBy(comparingInt(Dish::getCalories)));
reducing |
归约操作产生的类型 |
从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值 |
使用示例:int totalCalories =
menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen |
转换函数返回的类型 |
包裹另一个收集器,对其结果应用转换函数 |
使用示例:int howManyDishes =
menuStream.collect(collectingAndThen(toList(), List::size));
groupingBy |
Map<K, List<T>> |
根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键 |
使用示例:Map<Dish.Type,List<Dish>> dishesByType =
menuStream.collect(groupingBy(Dish::getType));
partitioningBy |
Map<Boolean,List<T>> |
根据对流中每个项目应用谓词的结果来对项目进行分区 |
使用示例:Map<Boolean,List<Dish>> vegetarianDishes =
menuStream.collect(partitioningBy(Dish::isVegetarian));