T
-
T
的输入元素的类型
A
-
A
的可变累积类型(通常作为实现细节隐藏)
R
-
R
的结果类型
public interface Collector<T,A,R>
可变缩减操作的示例包括:将元素累加到一个Collection
; 使用连接字符串StringBuilder
; 计算诸如sum,min,max或average之类的元素的摘要信息; 计算“枢纽表”摘要,如“卖方最大价值交易”等。Collectors
类提供了许多常见的可变减少的实现。
A Collector
由四个函数来指定,这四个函数一起工作以将条目累加到可变结果容器中,并且可选地对结果进行最终转换。 他们是:
supplier()
) accumulator()
) combiner()
) finisher()
) 收集者还具有一系列特征,如Collector.Characteristics.CONCURRENT
,它提供了可以通过减少实现来提供更好性能的提示。
使用收集器的顺序实现减少将使用供应商函数创建单个结果容器,并为每个输入元素调用累加器函数一次。 并行实现将分区输入,为每个分区创建一个结果容器,将每个分区的内容累加到该分区的子结果中,然后使用组合器函数将子结果合并为一个组合结果。
为了确保顺序和并行执行产生相同的结果,收集器功能必须满足一个身份和一个associativity约束。
身份约束说,对于任何部分累积的结果,将其与空结果容器组合必须产生等效的结果。 也就是说,部分累加结果a
即任何系列累加器和组合器的调用的结果, a
必须等同于combiner.apply(a, supplier.get())
。
关联约束说,分割计算必须产生等效的结果。 也就是说,对于任何输入元件t1
和t2
,下面的计算中的结果r1
和r2
必须是等效的:
A a1 = supplier.get(); accumulator.accept(a1, t1); accumulator.accept(a1, t2); R r1 = finisher.apply(a1); // result without splitting A a2 = supplier.get(); accumulator.accept(a2, t1); A a3 = supplier.get(); accumulator.accept(a3, t2); R r2 = finisher.apply(combiner.apply(a2, a3)); // result with splitting
对于没有UNORDERED
特征的UNORDERED
器,如果finisher.apply(a1).equals(finisher.apply(a2))
,则两个累计结果a1
和a2
finisher.apply(a1).equals(finisher.apply(a2))
。 对于无序的收藏者,放宽等价以允许与秩序的差异相关的不平等。 (例如,将元素累加到一个List
将考虑两个列表等价,如果它们包含相同的元素,忽略顺序。)
基于Collector
( Stream.collect(Collector)
)实施减少的库必须遵守以下约束:
Collector
需要实现任何额外的同步。 还原实现必须管理输入被正确分区,分区被隔离处理,并且组合仅在累积完成后才进行。 Collector.Characteristics.UNORDERED
特性或者起始数据无序时,才应用并发减少。 除了Collectors
中的预定义实现 ,静态工厂方法of(Supplier, BiConsumer, BinaryOperator, Characteristics...)
可用于构建收集器。 例如,您可以创建一个收集器,将小部件累积到TreeSet
中:
Collector<Widget, ?, TreeSet<Widget>> intoSet = Collector.of(TreeSet::new, TreeSet::add, (left, right) -> { left.addAll(right); return left; });
(此行为也由预定义的收集器Collectors.toCollection(Supplier)
实现 )。
Collector
应该产生一个结果等同于:
R container = collector.supplier().get(); for (T t : data) collector.accumulator().accept(container, t); return collector.finisher().apply(container);
然而,库可以自由分割输入,执行分区的减少,然后使用组合器函数组合部分结果以实现并行还原。 (根据具体的减速操作,这可能会更好或更差,取决于累加器和组合器功能的相对成本。)
收藏家的目的是组成 ; Collectors
中的许多方法是收集器并产生新收集器的函数。 例如,给定以下收集器来计算员工流的总和:
Collector<Employee, ?, Integer> summingSalaries = Collectors.summingInt(Employee::getSalary))
如果我们想创建一个收集器由部门制表工资的总和,我们可以利用重用逻辑“的工资总和” Collectors.groupingBy(Function, Collector)
:
Collector<Employee, ?, Map<Department, Integer>> summingSalariesByDept = Collectors.groupingBy(Employee::getDepartment, summingSalaries);
Stream.collect(Collector)
, Collectors
Modifier and Type | Interface and Description |
---|---|
static class |
Collector.Characteristics
指示Collector的属性的
Collector ,可用于优化还原实现。
|
Modifier and Type | Method and Description |
---|---|
BiConsumer<A,T> |
accumulator()
将值折叠成可变结果容器的函数。
|
Set<Collector.Characteristics> |
characteristics()
返回一个
Set 的
Collector.Characteristics 表示该收藏家的特征。
|
BinaryOperator<A> |
combiner()
一个接受两个部分结果并将其合并的函数。
|
Function<A,R> |
finisher()
执行从中间累积类型
A 到最终结果类型
R 的最终
R 。
|
static <T,A,R> Collector<T,A,R> |
of(Supplier<A> supplier, BiConsumer<A,T> accumulator, BinaryOperator<A> combiner, Function<A,R> finisher, Collector.Characteristics... characteristics)
返回一个新
Collector 由给定的描述
supplier ,
accumulator ,
combiner 和
finisher 功能。
|
static <T,R> Collector<T,R,R> |
of(Supplier<R> supplier, BiConsumer<R,T> accumulator, BinaryOperator<R> combiner, Collector.Characteristics... characteristics)
返回一个新
Collector 由给定的描述
supplier ,
accumulator 和
combiner 功能。
|
Supplier<A> |
supplier()
一个创建并返回一个新的可变结果容器的函数。
|
BiConsumer<A,T> accumulator()
BinaryOperator<A> combiner()
Function<A,R> finisher()
A
到最终结果类型R
的最终R
。
如果设置了特征IDENTITY_TRANSFORM
,则可以将此功能推定为具有A
至R
的未经检查的转换的身份转换。
Set<Collector.Characteristics> characteristics()
Set
的Collector.Characteristics
表明该收藏家的特征。
这一套应该是不变的。
static <T,R> Collector<T,R,R> of(Supplier<R> supplier, BiConsumer<R,T> accumulator, BinaryOperator<R> combiner, Collector.Characteristics... characteristics)
Collector
由给定的描述supplier
, accumulator
和combiner
功能。
所得Collector
具有Collector.Characteristics.IDENTITY_FINISH
特点。
T
- 新收集器的输入元素的类型
R
- 新收藏家的中间累积结果类型和最终结果
supplier
- 新收藏家的供应商功能
accumulator
- 新收集器的累加器功能
combiner
- 新收集器的组合器功能
characteristics
- 新收集器的收集器特性
Collector
NullPointerException
- 如果任何参数为空
static <T,A,R> Collector<T,A,R> of(Supplier<A> supplier, BiConsumer<A,T> accumulator, BinaryOperator<A> combiner, Function<A,R> finisher, Collector.Characteristics... characteristics)
Collector
由给定的描述
supplier
,
accumulator
,
combiner
和
finisher
功能。
T
- 新收集器的输入元素的类型
A
- 新收藏家的中间累积类型
R
- 新收藏家的最终结果类型
supplier
- 新收藏家的供应商功能
accumulator
- 新收集器的累加器功能
combiner
- 新收集器的组合器功能
finisher
- 新收藏家的完成器功能
characteristics
- 新收集器的收集器特性
Collector
NullPointerException
- 如果任何参数为空