Java 8流和parallelStream

法纳

假设我们有一个Collection这样的:

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);
}

并进行处理:

set.stream().forEach(subSet -> subSet.stream().forEach(System.out::println));

要么

set.parallelStream().forEach(subSet -> subSet.stream().forEach(System.out::println));

要么

set.stream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));

要么

set.parallelStream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));

所以,有人可以向我解释一下:

  • 它们之间有什么区别?
  • 哪一个更好?快点?更安全?
  • 哪一个适合大量收藏?
  • 当我们想对每个项目进行繁重的处理时,哪一个是好的?
彼得·劳瑞

它们之间有什么区别?

可以将其视为两个嵌套循环。

  • 在第一种情况下,没有并行性,
  • 在第二种情况下,外部循环/集合是并行的
  • 在第三种情况下,内部循环/集合如果更并行。
  • 在最后一种情况下,您将混合使用并行性,这可能比有用性更令人困惑。

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

哪一个更好?快点?更安全?

第一个,但是使用平面地图会更简单。

set.stream().flatMap(s -> s.stream()).forEach(System.out::println);

其他版本则更为复杂,并且由于作为瓶颈的控制台是共享资源,因此多线程版本可能会比较慢。

哪一个适合大量收藏?

假设您的目标是执行打印以外的操作,那么您想要执行足够的任务以使所有CPU保持忙碌,但是没有那么多任务会产生开销。第二种选择可能值得考虑。

当我们想对每个项目进行繁重的处理时,哪一个是好的?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章