我有一个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!
我可以使用上面的代码来获取总和,但numbers
的内容是Integer
元素,远低于Integer.MAX_VALUE
,并且有大量元素使得它们的总和可能溢出。如何将Integer
元素流转换为Long
元素流并将其安全地汇总?
答案 0 :(得分:9)
使用mapToLong(Integer::longValue)
代替mapToInt(...)
:
long sum = numbers.stream().mapToLong(Integer::longValue).sum();
答案 1 :(得分:0)
mapToLong方法将是正确使用的方法。它应该避免溢出问题,因为计算完成的时间很长。
long sum=numbers.stream().mapToLong(Number::longValue).sum();