为什么IntStream.sum()
返回int值?这是一些概念上的错误吗?从示例数组创建流时:
int A[] = {2^31-5, 2, 2, 2};
所有元素的总和超过最大整数值,但不会引发异常。有人知道如何预防这种情况吗?
该行为与您int
在循环中对s求和时所得到的相匹配。有多种方法可以处理溢出,所有方法都是在通用性和性能之间进行权衡,并且由于尚不清楚该API将/应该使用哪种API,因此选择了Java开发人员通常已知的API 。
如果要使用更大的数据类型求和,则可以使用
long sumL=IntStream.of(A).asLongStream().sum();// may still overflow
或者
BigInteger sum = IntStream.of(A).mapToObj(BigInteger::valueOf)
.reduce(BigInteger.ZERO, BigInteger::add);// might be slower
如果要抛出行为,可以使用
int sum=IntStream.of(A).reduce(0, (a,b)->{
int c=a+b;
if(a>0? b>0 && c<0: b<0&& c>0)
throw new ArithmeticException("overflow");
return c;
});
或者更简单(集成Stuart Marks的解决方案)
int sum=IntStream.of(A).reduce(0, Math::addExact);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句