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

时间:2015-03-22 10:03:12

标签: java parallel-processing

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

这是否可以使用并行Streams?

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

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

2 个答案:

答案 0 :(得分:2)

是的,这是可能的:

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我可以看到我在我的机器上进行并行化需要大约5ms(超过100次迭代)的开销,这实际上几乎没有任何时间。

答案 1 :(得分:0)

你要问的是map / reduce算法。据我所知,JDK8中没有通用的map / reduce,但是特定的实现使用它。例如,这将以并行/顺序模式实现:

Arrays.stream(new int[] { 1, 2}).sum();

阅读Parallel API源非常适合教育。