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.