一.collectbash
1.collect:收集器app
2.Collector做为collect方法的参数ide
3.Collector是一种接口,它是一个可变的汇聚操做,将输入元素累积到一个可变的结果容器中,它会在全部元素都处理完毕后,将累积的结果转换为一个最终的表示(这是一个可选操做);它支持串行与并行两种方式执行函数
4.Collectors自己提供了关于Collector的常见汇聚实现,Collectors自己其实是一个工厂spa
5.Collector里有三个参数类型T,A,R(后续作补充)
code
6.Collector里面有四种参数方法排序
supplier,accumulator,combiner,finisher,在这里先主要写supplier和accumulator.接口
二. supplierci
建立并返回一个可变结果容器;Supplier接口不接受参数并返回一个结果。get
Supplier<A> supplier();复制代码
三.accumulator
将新的数据元素(包括集合)给合并到一个结果容器(将值给折叠到一个可变的结果容器当中,这个可变容器能够是输入元素中的的第一个元素(集合)也能够是新的集合)
BiConsumer接口 接受两个参数不返回值
BiConsumer<A,T> accumulator();复制代码
四.combiner
将两个结果容器给合并成一个
BinaryOperator接口 接受两个参数返回一个接果 这三个值为同类型
BinaryOperator<A> combiner();复制代码
五.finisher
对容器执行一个可选的最终转换
Function接口接受一个参数返回一个结果 两个值不是同类型
Function<A,R> finisher复制代码
六.统一性和结合性
为了保证串行流和并行流操做结果的等价性,须要collect函数知足两个条件,identity(同一性)和associativity(结合性)
identity:针对于任何部分累积的结果中,将它与一个空的中间容器的合并时,获得的结果与部分累积的结果一致(a== combiner.apply(a,supplier.get()))
(List<String>list1,List<String>list2) ->(list1.addAll(list2); return list1)
associativity:并行流分区分割计算的结果与串行流计算的结果也是同样的
针对与有序的collect 只要保证finisher.apply(a1).equals(finisher.apply(a2))是正确的就知足告终合性,若是是无序的collect,其中对于该规则就要求没那么严格,只要求他们具备相同的元素,而忽略了元素的排序。
reduce:对于集合里的操做的元素是不可变的,在串行流操做是没有影响,而在并行流使用时结果会出错(之后作详细补充)
collect:对于集合里的操做的元素是可变的
七.Collector的参数类型
库基于Collector实现了reduction,须要遵照如下约束
Collector<T,A,R>
T:流操做中每个参数的类型
A:累积中间操做生成的结果类型
R:汇聚操做的结果类型