假设我们有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));
所以,有人可以解释一下我:
答案 0 :(得分:7)
他们之间有什么区别?
将其视为两个嵌套循环。
第四种情况不明确,因为实际上只有一个线程池,如果池忙,则可以使用当前线程,即它可能根本不是并行^ 2。
哪一个更好?快点?更安全吗?
第一个,但是使用平面地图会再次简单。
set.stream().flatMap(s -> s.stream()).forEach(System.out::println);
其他版本更复杂,因为作为瓶颈的控制台是共享资源,多线程版本可能会更慢。
哪一个对大型藏品有好处?
假设您的目标是执行除打印之外的其他操作,您希望有足够的任务来保持所有CPU的繁忙,但不会产生很多任务,从而产生开销。第二种选择可能值得考虑。
当我们想对每个项目应用繁重的流程时,哪一个是好的?
同样,第二个例子可能是最好的,如果你有少量的外部集合,可能是第三个。