Java 如果元素之和大于Integer.MAX_值,我们可以使用IntStream#sum吗?

Java 如果元素之和大于Integer.MAX_值,我们可以使用IntStream#sum吗?,java,java-stream,Java,Java Stream,当流中的元素总和大于整数.MAX_值时会发生什么情况 int sum = IntStream.of(Integer.MAX_VALUE, 1).sum(); 在我的计算机中,它返回,-(Integer.MAX\u VALUE+1)->-2147483648 因此,什么时候不应该使用java.util.stream.IntStream#sum?如果可以保证值不会超过最大整数值,或者处理代码中的溢出,那么应该使用IntStream#sum。否则,您可以使用LongStream,例如System.o

当流中的元素总和大于
整数.MAX_值时会发生什么情况

int sum = IntStream.of(Integer.MAX_VALUE, 1).sum();
在我的计算机中,它返回,
-(Integer.MAX\u VALUE+1)
->
-2147483648


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

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

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

每当任何整数超过最大值时,它就从整数的下限开始计数。 例如:如果你写Integer.MAX_值+10,它将给出u-2147483639。 所以在这里,
jvm从0开始计数到整数的最大值,然后在达到最大值后开始计数(-2147483648,-2147483647,…直到-2147483639)

每当任何整数超过最大值时,它就从整数的下限开始计数。 例如:如果你写Integer.MAX_值+10,它将给出u-2147483639。 所以在这里,
jvm从0开始计数到整数的最大值,然后在达到最大值后,它开始计数形式(-2147483648,-2147483647,…直到-2147483639)

int+int
执行相同的操作。这个问题不在于
sum()
,而在于您使用的类型太有限

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

2147483648

所有数据类型都有限制,使用时需要注意这些限制。您可能会争辩说,与其默默地给出意外的结果,不如产生一个错误,但这不是类型的实现方式。

int+int
也做了同样的事情。这个问题不在于
sum()
,而在于您使用的类型太有限

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

2147483648

所有数据类型都有限制,使用时需要注意这些限制。您可能会争辩说,与其默默地给出意外的结果,不如产生一个错误,但这不是类型的实现方式。

当您关心结果的正确性并怀疑总和可能溢出时。就像你做任何其他涉及整数的运算一样,当一个人关心结果的正确性并怀疑总和可能溢出时。就像执行任何涉及整数的其他操作一样。使用
.mapToLong(i->i)
而不是
.asLongStream()
。使用
.asLongStream()
而不是
.mapToLong(i->i)