繁体   English   中英

Java Parallel Stream生成HashMap

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM