T
-还原操作的输入元素的类型
A
-还原操作的积累型(经常隐藏实现细节)
R
-减运算的结果类型
public interface Collector<T,A,R>
可变减速操作的例子包括:积累元素为Collection
;连接字符串使用StringBuilder
;计算汇总信息等要素的总和,min,max,或平均值;计算“数据透视表”总结如“最大值的交易的卖方”等类Collectors
提供许多常见的可变减少的实现。
一个Collector
由四个功能一起工作,积累的作品成为一个可变的结果容器指定,和选择性的进行最后的变换结果。他们是:
supplier()
)创造的结果accumulator()
)结果combiner()
)finisher()
)收藏家也有一套特征,如Collector.Characteristics.CONCURRENT
,提供暗示,可以通过减少实施应用提供更好的性能。
使用收集器的减少的顺序执行将创建一个单一的结果容器,使用供应商的功能,并调用一次为每个输入元件的蓄电池功能。并行执行分区的输入,创建每个分区结果的容器,积累各分区的内容到一个分区subresult,然后使用组合功能合并成一个综合结果subresults。
确保顺序和并行执行,产生相同的结果,集函数必须满足的一个身份和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
特点,两积累的结果,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 性能,可用于优化还原的实现。
|
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 型执行最终的转化。
|
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
型进行最后的转变。
如果特征IDENTITY_TRANSFORM
设置,这个功能可认为是从A
到R
unchecked铸变换身份。
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
-如果任一参数为空
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.