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)
。