Collector就是收集器的意思。
Collector内部实现的方法有4个分别是:
1.supplier 该方法相当于结果容器 作用是创建并返回一个可变的结果容器
2.accumulator 该方法相当于累加器 把流中的元素累加到结果容器中
3.combiner 该方法相当于组合器 并行流下,把多个并行得到的部分结果组合成一个最终结果
4.finish 该方法相当于最终结果容器 (可选择的)把最终结果转换成另一种类型的结果
characteristics方法,标识该收集器的特征
1.CONCURRENT characteristics中存在枚举IDENTITY_FINISH,则中间结果容器只会存在一个,不管是否是并行流。注意使用 parallelStream并行流。accumulator 执行时,多个线程同时操作一个结果容器(多线程情况下),进行边查询边修改,会抛出ConcurrentModificationException (并行时操作异常)。不加CONCURRENT ,多个线程会产生多个结果容器,例如下面有多个set,则不会抛出异常,然后执行combiner和并结果。
总结:并行环境下,并且不加CONCURRENT枚举,combiner方法才会被执行,多个线程产生多个结果并进行合并。加上CONCURRENT枚举,combiner方法不会被执行,一个结果不需要合并。
2.IDENTITY_FINISH characteristics中存在枚举IDENTITY_FINISH ,会强制转换成结果类型,不会调用finish方法 否则会调用finish方法
3.UNORDERED characteristics中存在枚举UNORDERED 结果容器时无序的