Stream api reduce method returns 试图求和大数时的负值
Stream api reduce method returns negative value when trying to sum up large numbers
我正在尝试使用流 api reduce 方法对列表中的数字求和。它为较小的数字提供正确的结果。但是当我给出更大的数字时,它 returns 一个不正确的负数。
这是我的代码
public void sumOfNum(List<Integer> numbers) {
long result = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.print(result);
}
测试用例 1(通过)
输入
12345, 2343,4324,2323,24234
输出
45569
测试用例 2(失败)
输入
256741038, 623958417,623958417,714532089, 714532089
输出
-1361245246
您正在使用当前代码执行 Integer
添加。我的假设是您知道可能发生的数字溢出,这就是 long
类型 result
的原因。一旦您 map
将流的值 Long
加起来,事情就会到位。
long result = numbers.stream()
.map(Long::valueOf)
.reduce(0L, Long::sum);
或者简单地说:
long result = numbers.stream()
.mapToLong(val -> val)
.sum();
您将它们作为整数添加,并且 java 对整数值有限制 2147483647
。
如果您超过此最大值,您将从最小值开始计数
Integer.MAX_VALUE + 1 = -2147483648
.
我正在尝试使用流 api reduce 方法对列表中的数字求和。它为较小的数字提供正确的结果。但是当我给出更大的数字时,它 returns 一个不正确的负数。
这是我的代码
public void sumOfNum(List<Integer> numbers) {
long result = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.print(result);
}
测试用例 1(通过)
输入
12345, 2343,4324,2323,24234
输出
45569
测试用例 2(失败)
输入
256741038, 623958417,623958417,714532089, 714532089
输出
-1361245246
您正在使用当前代码执行 Integer
添加。我的假设是您知道可能发生的数字溢出,这就是 long
类型 result
的原因。一旦您 map
将流的值 Long
加起来,事情就会到位。
long result = numbers.stream()
.map(Long::valueOf)
.reduce(0L, Long::sum);
或者简单地说:
long result = numbers.stream()
.mapToLong(val -> val)
.sum();
您将它们作为整数添加,并且 java 对整数值有限制 2147483647
。
如果您超过此最大值,您将从最小值开始计数
Integer.MAX_VALUE + 1 = -2147483648
.