Java 8 流和并行流

6
假设我们有一个如下的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));

所以,请问有人能够解释一下:

  • 它们之间有什么区别?
  • 哪一个更好?更快?更安全?
  • 哪一个适合处理大量数据集合?
  • 哪一个适合在每个项目上应用重型进程?
1个回答

7
它们之间有什么区别?
将其视为像两个嵌套循环。
在第一种情况下,没有并行性,
在第二种情况下,外部循环/集合是并行的,
在第三种情况下,内部循环/集合更加并行。
在最后一种情况下,你有混合并行性,这可能比有用更令人困惑。
第四种情况不清楚,因为现实中只有一个线程池,如果池忙碌,当前线程可以被使用,也就是说它可能根本不是平方并行。
哪一个更好?更快?更安全?
第一个,但使用 flat map 可能会再次更简单。
set.stream().flatMap(s -> s.stream()).forEach(System.out::println);

其他版本更复杂,由于控制台是瓶颈和共享资源,多线程版本可能会更慢。
“对于大量的集合哪个版本更好?”
假设你的目标不仅是打印,你希望有足够的任务来保持所有CPU忙碌,但又不要太多任务以避免创建额外开销。第二个选项可能值得考虑。
“当我们想对每个项目应用重处理时哪个版本更好?”
再次,第二个示例可能最好,或者如果您只有少量外部集合,则可能是第三个选项。

非常感谢,解释得非常好 :) - FaNaJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接