+-
java – 何时使用Collectors.groupingByConcurrent?
我没有理解Collectors.groupingByConcurrent的确切用例.
来自 JavaDocs:

Returns a concurrent Collector implementing a cascaded “group by” operation on input elements of type T…

This is a concurrent and unordered Collector.

也许这里的关键词是“分组”的级联.这是否意味着收集者如何进行实际积累? (看来源,很快就错了)

当我用假的ConcurrentMap测试它

class FakeConcurrentMap<K, V> extends HashMap<K, V> 
    implements ConcurrentMap<K, V> {}

我看到它与并行流断开(因为映射不是线程安全的,给出了错误的聚合):

Map<Integer, Long> counts4 = IntStream.range(0, 1000000)
        .boxed()
        .parallel()
        .collect(
            Collectors.groupingByConcurrent(i -> i % 10, 
                                          FakeConcurrentMap::new, 
                                          Collectors.counting()));

没有.parallel(),结果始终是正确的.所以似乎groupingByConcurrent与并行流一起使用.

但是,据我所知,使用groupingBy收集的以下并行流总是产生正确的结果:

Map<Integer, Long> counts3 = IntStream.range(0, 1000000)
        .boxed()
        .parallel()
        .collect(
            Collectors.groupingBy(i -> i % 10, 
                                  HashMap::new,
                                  Collectors.counting()));

那么什么时候使用groupingByConcurrent而不是groupingBy是正确的(当然不能只是将分组作为并发映射)?

最佳答案
所有收集器对并行流都可以正常工作,但支持直接并发的收集器(使用Collector.Characteristics.CONCURRENT)有资格进行其他非优化的优化. groupingByConcurrent属于这一类.

(粗略地说,发生的事情是非并发收集器将输入分解为每个线程片段,每个线程创建一个累加器,然后在最后合并它们.并发(和无序)收集器创建一个累加器并具有多个工作线程同时将元素合并到同一个累加器中.)

点击查看更多相关文章

转载注明原文:java – 何时使用Collectors.groupingByConcurrent? - 乐贴网