表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));