1、collect是一个终端操作,它接受的参数是将流中元素累计到汇总结果的各种方式(称为收集器,对应参数的函数式接口是Collector<T, A, R>)
2、Collector<T, A, R>:其中T、A、R分别是流中元素的类型、用于累积部分结果的对象类型,collect操作最终结果的类型。
3、预定义收集器java.util.steam.Collectors:包含将流元素归约和汇总到一个值,例如计算最小值、最大值或平均值。总结如下:
a)、Collector<T, ?, List<T>> toList();
把流中所有项目收集到一个List中。
b)、Collector<T, ?, Set<T>> toSet();
把流中所有项目收集到一个Set中(不会出项重复项)。
c)、Collector<T, ?, C> toCollection(Supplier<C> collectionFactory);
把流中所有项目收集到给定的供应源创建的集合中。
d)、Collector<T, ?, Long> counting();
计算流中元素的个数。
e)、Collector<T, ?, Integer> summingInt(ToIntFunction<? super T> mapper);
对流中项目的一个整数属性求和。
f)、Collector<T, ?, Double> averagingInt(ToIntFunction<? super T> mapper);
对流中项目的Integer属性计算平均值。
g)、Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper);
收集关于流中项目Integer属性的统计值,例如最大、最小、总和与平均值。
h)、Collector<CharSequence, ?, String> joining(CharSequence delimiter);
连接对流中每个项目调用toString()方法所生成的字符串。
i)、Collector<T, ?, Optional<T>> maxBy(Comparator<? super T> comparator);
一个包裹了流中按照给定比较器选出的最大元素的Optional,或如果流为空则Optional.empty() == true。
j)、Collector<T, ?, Optional<T>> minBy(Comparator<? super T> comparator);
一个包裹了流中按照给定比较器选出的最小元素的Optional,或如果流为空则Optional.empty() == true。
k)、Collector<T, ?, U> reducing(U identity, Function<? super T, ? extends U> mapper, BinaryOperator<U> op);
从一个作为累加器的初始值开始,利用BinaryOperator与流中的元素逐个结合,从而将流规约为单个值。
使用示例:int totalCalories = menuStream.collect(Collectors.reducing(0, Dish::getCalories, Integer::sum));
l)、Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher);
包裹另一个收集器,对其结果应用转换函数。
使用示例:int howManyDishes = menuStream.collect(Collectors.collectingAndThen(Collectors.toList(), List::size));
m)、Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier);
根据项目的一个属性的值对流中的项目作问组,并将属性值作为结果Map的键。
n)、Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate);
根据对流中每个项目应用谓词的结果来对项目进行分区。
4、收集器可高效地复合起来,进行多级分组、分区和规约。
5、可以实现Collector接口中定义的方法来开发自定义的收集器
网友评论