【发布时间】:2017-06-06 17:11:51
【问题描述】:
在Aggregating with Streams 中,Brian Goetz 比较了使用 Stream.collect() 填充集合和使用 Stream.forEach() 填充集合,以及以下两个 sn-ps:
Set<String> uniqueStrings = strings.stream()
.collect(HashSet::new,
HashSet::add,
HashSet::addAll);
还有,
Set<String> set = new HashSet<>();
strings.stream().forEach(s -> set.add(s));
然后他解释说:
关键 不同之处在于,对于 forEach() 版本,多个线程正在尝试访问单个结果 同时容器,而使用并行 collect(),每个线程都有自己的本地结果 容器,然后合并结果。
据我了解,只有在流是并行的情况下,多个线程才会在 forEach() 情况下工作。但是,在给出的示例中,forEach() 是在顺序流上运行的(不调用 parallelStream())。
那么,是 forEach() 总是并行工作,还是代码 sn-p 应该调用 parallelStream() 而不是 stream()。 (或者我错过了什么?)
【问题讨论】:
-
顺便说一句,在示例中,collect() 也没有在并行流上被调用。 (?)
标签: java java-stream