Java 8流和parallelStream

FaN*_*NaJ 6 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);
}
Run Code Online (Sandbox Code Playgroud)

并处理它:

set.stream().forEach(subSet -> subSet.stream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)

要么

set.parallelStream().forEach(subSet -> subSet.stream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)

要么

set.stream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)

要么

set.parallelStream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)

所以,有人可以解释我:

  • 他们之间有什么区别?
  • 哪一个更好?快点?更安全?
  • 哪一个适合大量收藏?
  • 当我们想对每个项目应用繁重的流程时,哪一个是好的?

Pet*_*rey 7

他们之间有什么区别?

可以把它想象成两个嵌套循环.

  • 在第一种情况下没有并行性,
  • 在第二种情况下,外环/集合是平行的
  • 在第三种情况下,内部循环/集合如果更平行.
  • 在最后一种情况下,你有一个并行的混合,这可能更混乱而不是有用.

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

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

第一个,但使用平面地图将再次更简单.

set.stream().flatMap(s -> s.stream()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

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

哪一个适合大量收藏?

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

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

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