JAVA Collector
2024-03-10 16:19:36
collector位于java.util.在stream下,根据javaDoc的描述:
A mutable reduction operation that accumulates input elements into a mutable result container,
optionally transforming the accumulated result into a final representation after all input elements
have been processed. Reduction operations can be performed either sequentially or in parallel.
Collector是一种可变的聚集操作,按照指定的策略将输入的元素存储在可变容器中,待所有元素处理完成后,将结果转换为最终表示。例如,常用的Mapp最终表示、Set、List等等。
Collector接口定义Collector是一个包含三个泛型和五个函数的接口定义:
public interface Collector<T, A, R> {
Supplier<A> supplier();
BiConsumer<A, T> accumulator();
BinaryOperator<A> combiner();
Function<A, R> finisher();
Set<Characteristics> characteristics();
}
接口泛型
T是输入对象的类型,A是累加器的类型,R是最终收集的结果类型
接口函数1. 建立累加器容器的supplier方法
Supplier<A> supplier();
建立一个新的累加器容器。该方法定义了如何收集数据,必须返回一个无参数函数,用于为数据收集过程创建一个空的累加器实例。
示例:
@Override
public Supplier<List<T>> supplier() {
return ArrayList::new;
}
2. 具体实现accumulator累加器累加的方法
BiConsumer<A, T> accumulator();
该方法将返回执行累加操作的函数,该函数有两个参数返回值为空,第一个参数为累加器容器,第二个参数为累加元素。
示例:
@Override
public BiConsumer<List<T>, T> accumulator() {
return List::add;
}
3. 合并容器combiner方法
Collector支持并行,并行涉及任务分段和结果合并。
BinaryOperator<A> combiner();
将两个结果合并为一个,该方法返回一个供合并操作的函数。
示例:
@Override
public BinaryOperator<List<T>> combiner() {
return (list1, list2) -> {
list1.addAll(list2);
return list1;
};
}
4. 将结果finisher转换为结果finisher
Function<A, R> finisher();
在容器上执行最终转换,该方法返回一个转换函数,参数为累计值,返回值是最终转换返回的东西。
示例:
@Override
public Function<List<T>, List<T>> finisher() {
return (i) -> i * i;
}
5. characteristics方法
Set<Characteristics> characteristics();
回到一个不可变的characteristics集合,它定义了收集器的行为,比如stream是否可以归还合同,可以使用哪些优化。
Characteristics是一个包含三个项目的枚举:
- UNORDERED--合同结果不受流中项目的遍历和累积顺序的影响
- CONCURRENT--Accumulator函数可以同时从多个线程调用,收集器可以并行归约流。如果收集器没有标记为UNORDERED, 只有在使用无序数据源时才能并行归约。
- IDENTITY_FINISH--这表明完成器方法返回的函数是一个可以跳过的恒等函数。在这种情况下,累加器对象将直接用作合同过程的最终结果。这意味着将累加器A转换为结果R是安全的。
// 类型归纳法
// 通过Stream.collect方法
Collector.toList();
Collector.toMap();
Collector.toSet();
Collector.toCollection();
Collector.toConcurrentMap();
// joining
// 将元素与某些规则联系起来
.stream().collect(Collectors.joining());
// collectingAndThen
// groupingBy
// partitioningBy
// counting
// maxBy/minBy
// summingInt/Double/Long
// summarizingInt/Double/Long
// mapping
// reducing
// 待更新
三、根据集合获取streamm
stream的常用方法:
- 终结方法:返回值类型不再是stream接口本身的类型,如foreach、count等。
- 非终结方法:返回值类型仍然是stream接口本身类型的方法,如filter、limit等。
方法名称
方法作用
方法种类
是否支持链式调用?
count
统计个数
终结方法
否
forEach
逐一处理
终结方法
否
filter
过滤
函数拼接
是
limit
取用前几个
函数拼接
是
skip
跳过前几个
函数拼接
是
map
映射
函数拼接
是
concat
组合
函数拼接
是