Java并行流产生HashMap

标签 java java-stream

我有以下测试,测试从 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/

相关文章:

java - 如何限制groupBy java流

java - 在 Java 流中插入值

Java-Stream,带有重复键的 toMap

Java 8 的 forEach 流

java - 将数字四舍五入到百位

java - if-else block 中的大括号

java - Android Studio 启动画面在 Activity 开始前消失

java - hibernate 恩弗斯 : Retrieving the right revisions of an entity with a collection property

java - Json 到 Java 对象转换中带有 null 响应的 Spring MVC 请求

java - 递归流