首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8流与parallelStream

Java 8流与parallelStream
EN

Stack Overflow用户
提问于 2014-12-12 16:48:44
回答 1查看 881关注 0票数 6

假设我们有这样一个Collection

代码语言:javascript
复制
Set<Set<Integer>> set = Collections.newSetFromMap(new ConcurrentHashMap<>());
for (int i = 0; i < 10; i++) {
    Set<Integer> subSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
    subSet.add(1 + (i * 5));
    subSet.add(2 + (i * 5));
    subSet.add(3 + (i * 5));
    subSet.add(4 + (i * 5));
    subSet.add(5 + (i * 5));
    set.add(subSet);
}

并对其进行处理:

代码语言:javascript
复制
set.stream().forEach(subSet -> subSet.stream().forEach(System.out::println));

代码语言:javascript
复制
set.parallelStream().forEach(subSet -> subSet.stream().forEach(System.out::println));

代码语言:javascript
复制
set.stream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));

代码语言:javascript
复制
set.parallelStream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));

所以,谁能解释一下:

  • 他们之间有什么区别?
  • 哪一个更好?更快?而且更安全?
  • 哪一种适合大型收藏品?
  • 当我们想要对每个项目应用繁重的过程时,哪一个是好的?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 17:01:07

他们之间有什么区别?

把它想象成两个嵌套的循环。

  • 在第一种情况下,没有并行性,
  • 在第二种情况下,外部循环/集合是并行的。
  • 在第三种情况下,内部循环/集合(如果更并行)。
  • 在最后一种情况下,您有一种混合的并行性,它可能更容易混淆而不是有用。

第四种情况不清楚,因为实际上只有一个线程池,如果池繁忙,则可以使用当前线程(可能根本不是并行^2)。

哪一个更好?更快?而且更安全?

然而,使用平面地图的第一种方法会更简单。

代码语言:javascript
复制
set.stream().flatMap(s -> s.stream()).forEach(System.out::println);

其他版本更复杂,因为控制台是一个共享资源,因为控制台是一个瓶颈,所以多线程版本可能会慢一些。

哪一种适合大型收藏品?

假设您的目标是执行打印以外的其他任务,那么您希望有足够的任务来使您的CPU保持忙碌,但不要有太多的任务造成开销。第二种选择可能值得考虑。

当我们想要对每个项目应用繁重的过程时,哪一个是好的?

同样,如果有少量的外部集合,第二个示例可能是最好的,也可能是第三个示例。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27448282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档