gpt4 book ai didi

Java 8 流和并行流

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:21 25 4
gpt4 key购买 nike

假设我们有一个像这样的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));

那么,有人可以解释一下吗:

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

最佳答案

What is the difference between them?

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

  • 在第一种情况下没有并行性,
  • 在第二种情况下,外部循环/集合是并行的
  • 在第三种情况下,内部循环/集合更并行。
  • 在最后一种情况下,您混合了并行性,这很可能会造成困惑而不是有用。

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

Which one is better? faster? and safer?

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

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

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

Which one is good for huge collections?

假设您的目标是做打印以外的事情,您希望有足够多的任务来让所有 CPU 保持忙碌,但又不想有太多任务会产生开销。第二种选择可能值得考虑。

Which one is good when we want to apply heavy processes to each item?

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

关于Java 8 流和并行流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com