如何使用ParallelStream将一个数组的每个元素添加到另一个数组的相应元素?

时间:2014-05-19 20:15:30

标签: java arrays java-8

使用示例可能更容易解释我想要做的事情。让我们假设我必须遵循两个数组:

int firstArray[] = {1, 2, 3, 4, 5};
int secArray[] = {1, 2, 3, 4, 5};

我想要的是将第二个数组的每个元素i添加到第一个数组的每个元素i。当然,创建第三个数组也没关系。

在这个例子中,结果是:2, 4, 6, 8, 10

我可以在Java 8中使用ParallelStream以某种方式执行此操作吗?我只能想到使用至少一个索引的解决方案,并且由于并行性(这也违背了目的)它们不能真正起作用。

这种单线程方法有效:

AtomicInteger i = new AtomicInteger(0);
int resultArray[] = Arrays.stream(firstArray)
                          .map(a -> a + secArray[i.getAndIncrement()]).toArray();

但是如果我尝试使用并行流,结果(当然它们是)随机的,程序真的很慢。有任何想法吗?

1 个答案:

答案 0 :(得分:7)

这是IntStream的典型用例:

IntStream.range(0, firstArray.length).parallel()
    .forEach(i -> { secArray[i] += firstArray[i]; });

如果您需要在单独的数组中使用结果,则可以使用相同的方法:

int[] result = IntStream.range(0, firstArray.length).parallel()
    .map(i -> firstArray[i] + secArray[i])
    .toArray();