Java 8流和parallelStream

时间:2014-12-12 16:48:45

标签: java collections parallel-processing java-8 java-stream

假设我们有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 个答案:

答案 0 :(得分:7)

  

他们之间有什么区别?

将其视为两个嵌套循环。

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

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

  

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

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

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

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

  

哪一个对大型藏品有好处?

假设您的目标是执行除打印之外的其他操作,您希望有足够的任务来保持所有CPU的繁忙,但不会产生很多任务,从而产生开销。第二种选择可能值得考虑。

  

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

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