我有以下测试,测试从 0 到 max 的整数,如果通过验证,则构造对 (vals[i], i)。最后,我想生成一个 HashMap,它使用 vals[i] 作为键,值是整数列表。代码看起来像,
IntStream.range(0, max)
.parallel()
.filter(i-> sometest(i))
.mapToObj(i -> new Pair<>(vals[i],i))
.collect(groupingBy(Pair::getFirst, mapping(Pair::getSecond, toList())));
我的问题是,是否可以使用并行流来加速该 map 的构建?
谢谢。
最佳答案
如果你只是想知道如何更好地利用并行性,你可以这样做:
ConcurrentMap<Integer, List<Integer>> map = IntStream.range(0, Integer.MAX_VALUE)
.parallel()
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.groupingByConcurrent(
i -> i / 3,
Collectors.mapping(i -> i, Collectors.toList())));
不需要中间创建Pairs,groupingByConcurrent
并行累加到新的ConcurrentMap。
请记住,对于并行流,您只能使用常见的 ForkJoinPool
。对于并行化,最好使用更灵活的东西,例如 ExecutorService
而不是 Java Streams。
关于Java并行流产生HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284662/