我无法理解
Collectors.groupingByConcurrent
.
来自JavaDocs:
...
级联“分组方式”
. 这是否意味着收藏者是如何进行实际积累的(从源头上看,它很快变得错综复杂)
当我用一个
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()));
那么什么时候使用才是正确的呢
而不是
分组依据
(当然,这不可能仅仅是将分组作为一个并发映射)?