Java LongStream将int数组元素求和

7

由于许多整数在求和时可能会溢出,所以我需要一个长的流来完成工作,但它不接受 int 数组。我该如何在流处理时将每个元素转换而不是使用 long 数组呢?

// arr is an int[]
LongStream s = Arrays.stream( arr); // error
result = s.reduce(0, Long::sum); 

编辑:根据Tagir Valeev的回答,似乎整数流使用其方法被转换为长整型流。

LongStream asLongStream();

1个回答

8

使用IntStream.asLongStream()方法:

LongStream s = Arrays.stream(arr).asLongStream();

顺便提一下,s.reduce(0, Long::sum)是简单sum()方法的较长替代品(内部执行相同操作):

long result = Arrays.stream(arr).asLongStream().sum();

我想这不会将数组复制到一个临时长数组中。谢谢。 - huseyin tugrul buyukisik
1
@huseyintugrulbuyukisik,当然不会复制。 - Tagir Valeev
当我使用并行版本时,它在一开始计算速度为5毫秒(1600万个元素),然后几秒钟后,每个求和突然需要15毫秒。这是某些垃圾回收的结果吗? - huseyin tugrul buyukisik
1
@huseyintugrulbuyukisik,并行计算和基准测试可能是完全不同的故事。请发布单独的问题,并提供完整的时间测量代码和所有数字(元素数量,时间等)。一般来说,如果你担心效率,简单的for循环在这里可能会比流API表现更好,即使在并行计算中,因为求和是非常简单的操作。 - Tagir Valeev
2
使用jmh为您的代码设置适当的基准环境。http://openjdk.java.net/projects/code-tools/jmh/ - Thorbjørn Ravn Andersen
谢谢。我会研究一下的。 - huseyin tugrul buyukisik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接