将整数流汇总为Java中的长变量

san*_*ank 8 java java-8 java-stream

我有一个Java Set,其中包含一些Integer元素.我想用Java 8流来汇总它的元素.

Set<Integer> numbers = new HashSet<>();
// Some code that will populate numbers
int sum = numbers.stream().mapToInt(Integer::intValue).sum() //Can overflow!
Run Code Online (Sandbox Code Playgroud)

我可以用上面的代码来获得的总和,但内容numbersInteger元素远低于Integer.MAX_VALUE并且有大量的人,使得它们的总和可能溢出.如何将Integer元素流转换为元素流Long并将其安全地求和?

Ole*_*hov 9

使用mapToLong(Integer::longValue)而不是mapToInt(...):

long sum = numbers.stream().mapToLong(Integer::longValue).sum();
Run Code Online (Sandbox Code Playgroud)

  • 注意:这个解决方案的好处是它将创建一个[LongStream](https://docs.oracle.com/javase/9​​/docs/api/java/util/stream/LongStream.html),其中包含`消除不必要的拳击/拆箱! (5认同)
  • 很好的解决方案。不会在没有解释的情况下引入新方法! (2认同)