看下面的简单示例,它统计了列表中每个单词出现的次数:
Stream<String> words = Stream.of("a", "b", "a", "c");
Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
最终,wordsCount
的值为 {a=2, b=1, c=1}
。
但是我的数据流非常大,我希望能够并行处理这个任务,因此我写了以下代码:
Map<String, Integer> wordsCount = words.parallel()
.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
然而,我注意到wordsCount
仅仅是一个简单的HashMap
,因此我想知道是否需要显式地请求一个并发映射表以确保线程安全性:
Map<String, Integer> wordsCount = words.parallel()
.collect(toConcurrentMap(s -> s, s -> 1,
(i, j) -> i + j));
非并发收集器能否安全地与并行流一起使用,或者我只应该在从并行流收集时使用并发版本?
groupingBy
和groupingByConcurrent
之间的区别。前者保证顺序不变,并且可以并行安全,但可能会较慢。后者也是并行安全的,通常并行化更好,但牺牲了顺序保留。程序员必须选择他们的权衡。 - Brian Goetz