[英]Java Parallel Stream Produce HashMap
我有以下测试,测试从0到最大的整数,如果它被验证,构造对(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())));
我的问题是,是否可以使用并行流来加速该地图的构建?
谢谢。
如果您只是想知道如何更好地利用并行性,那么您可以执行以下操作:
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文档中所述:
如果对包含collect操作的特定管道满足以下所有条件,则Java运行时将执行并发减少:
- 流是平行的。
- collect操作的参数,即collector,具有特征Collector.Characteristics.CONCURRENT。 要确定收集器的特征,请调用Collector.characteristics方法。
- 流是无序的,或者收集器具有特征Collector.Characteristics.UNORDERED。 要确保流是无序的,请调用BaseStream.unordered操作。
但是,它是否会加速你的地图构建将取决于其他方面,如@Jigar Joshi所提到的,包括(但不仅仅是):
有时使用并行性(创建和停止线程,使它们进行通信和同步,......)的开销大于增益。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.