如果元素总数大于Integer.MAX_VALUE,我们可以使用IntStream#sum吗?

时间:2018-09-15 12:55:04

标签: java java-stream

当流中的元素总数大于Integer.MAX_VALUE时会发生什么?

int sum = IntStream.of(Integer.MAX_VALUE, 1).sum();

在我的计算机上,这将返回-(Integer.MAX_VALUE + 1)-> -2147483648

那么什么时候不应该使用java.util.stream.IntStream#sum

3 个答案:

答案 0 :(得分:2)

如果可以保证您的值不会超过最大整数值,或者您可以处理代码中的溢出,则应使用IntStream#sum。否则,您可以使用LongStream,例如System.out.println(LongStream.of(Integer.MAX_VALUE, 1).sum());

答案 1 :(得分:2)

任何整数越过最大值,它就会从整数的下限开始计数。 例如:如果您编写Integer.MAX_VAlUE + 10,它将给您-2147483639。 所以在这里, jvm从0开始计数到整数的最大值,然后在达到最大值后开始计数形式(-2147483648,-2147483647,...直到-2147483639)

答案 2 :(得分:1)

int + int做同样的事情。这个问题与sum()无关,而是您使用的类型太有限。

long sum = IntStream.of(Integer.MAX_VALUE, 1)
        .asLongStream()
        .sum();
System.out.println(sum);

打印

2147483648

所有数据类型都有局限性,使用它们时需要注意这些限制。您可能会争辩说,产生错误比静默给出意外结果更好,但这不是实现类型的方式。