IntStream.sum()异常处理

廷基

为什么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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从字节数组制作IntStream?

来自分类Dev

Java 8从输入构建IntStream的最佳方法

来自分类Dev

并行IntStream骇客

来自分类Dev

如何在IntStream上调用map()并返回其他类型?

来自分类Dev

异常处理的Swift异常

来自分类Dev

如何从List <Integer>获取IntStream?

来自分类Dev

IntStream奇怪的错误

来自分类Dev

IntStream的用例是什么?

来自分类Dev

将Stream转换为IntStream

来自分类Dev

Java 8流:从IntStream到String

来自分类Dev

Java 8 IntStream是否为int范围?

来自分类Dev

使用IntStream的flatMap方法打印2D数组

来自分类Dev

使用Java 8 IntStream计算阶乘?

来自分类Dev

如何使用Java流API生成IntStream

来自分类Dev

Java 8:将IntStream转换为Integer []

来自分类Dev

异常处理中的异常处理

来自分类Dev

处理异常

来自分类Dev

IntStream.boxed()与for循环| 表现

来自分类Dev

无限IntStream的长度是多少?

来自分类Dev

发生IntStream的Java数

来自分类Dev

Java8整数流Vs的IntStream

来自分类Dev

IntStream平均的打印结果

来自分类Dev

IntStream的随机置换

来自分类Dev

如何填充列表<整数>从IntStream?

来自分类Dev

异常内的异常处理

来自分类Dev

如何获取 IntStream.map.forEach 的索引?

来自分类Dev

在 Java 中流到 IntStream

来自分类Dev

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

来自分类Dev

将 Stream<IntStream> 转换为单个 IntStream