java - 如何使用 Java 8 Streams 并行处理列表中的元素以对它们进行求和

标签 java parallel-processing

鉴于加法具有交换性质,不需要以可序列化的方式对对象求和,例如,我们可以对元素进行对数求和,然后对结果求和,或者对列表的第一部分求和,然后对第二部分求和,并将两个结果相加,以使其更有效。 我正在尝试使用 Java 中的并行处理来做到这一点,但我还不太熟悉 API。

使用并行流可以实现这一点吗?

这是我开始编写的代码片段,但我不知道如何继续。谢谢

        Long result=CollectionUtils.isNotEmpty(accounts)?accounts.stream().parallel().mapToLong(account->account.getBalance))

最佳答案

是的,这是可能的:

accounts.stream().mapToLong(Account::getBalance).parallel().sum();

相同
accounts.stream().mapToLong(Account::getBalance).parallel().reduce(0, (a, b) -> a+b);

请注意:只有在处理非常大的数字集时,并行执行此操作才能真正开始节省时间。在较小的集合上,由于并行化开销,它实际上更慢。由于并行运算符,此代码的运行速度大约提高了一倍:

    int intCount = 100_000_000;
    int x[] = new int[intCount];
    Random rand = new Random();
    for (int i = 0; i < intCount; i++) {
        x[i] = rand.nextInt();
    }

    long ts = System.currentTimeMillis();

    for (int r = 0; r < 100; r++) {
        Arrays.stream(x).parallel().sum();
    }

    System.out.println("Time elapsed: " + (System.currentTimeMillis() - ts));

将 intCount 降低到 1,我可以看到我为机器上的并行化付出了大约 5 毫秒(超过 100 次迭代)的开销,这对于几乎什么都不做来说是相当多的时间。

关于java - 如何使用 Java 8 Streams 并行处理列表中的元素以对它们进行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29193055/

相关文章:

java - 将struts web项目升级到java 1.7

c - 您是否需要分配内存才能在 CUDA 中对数组进行操作?

go - 如何自动启用测试在包内并行运行?

java - 从 Class<?> 获取子类

java - Apache ftpserver docker 容器

java - 为什么 id 字段不能在 EclipseLink 的 where 子句中使用

java - JAX-RS:Jersey + Genson = MessageBodyProviderNotFoundException

r - 如何用 mclapply [并行化] 替换 Quantstrat 'for loop'?

testing - 在 Jenkins 构建流程插件中,如果其中一个失败,则终止所有并行作业

haskell - 延迟 IO + 并行 : converting an image to grayscale