gpt4 book ai didi

java - 什么时候使用 Collectors.groupingByConcurrent?

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:10 26 4
gpt4 key购买 nike

我无法理解 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.
...

也许这里的关键词是级联“group by”。这是否表明 Collection 家是如何进行实际积累的? (查看源代码,它很快变得错综复杂)


当我用 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?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com