Ash*_*mar 4 arrays java-8 java-stream
我有一个整数数组,想对所有元素求和。只要sum小于或等于int max值(2147483647),它就可以正常工作,但是当sum超过int max值时,它就会失败。以下是示例-:
int [] iArr = new int[]{2147483646 , 1 , 1};
System.out.println(Arrays.stream(iArr).sum());
Run Code Online (Sandbox Code Playgroud)
结果-:--2147483648
如我们所见,以上结果是不正确的。我知道可以通过使用长数组代替int数组来解决它,如下所示。
long [] iArr = new long[]{2147483646 , 1 , 1};
System.out.println(Arrays.stream(iArr).sum());
Run Code Online (Sandbox Code Playgroud)
结果-:2147483648
但是我不想使用长数组,因为我知道数组元素的最大大小限制是int max value(2147483647)。因此,我不想浪费内存。还有其他方法可以使用Array Stream对整数数组的总和((数组元素的总和)超过int max(2147483647))进行计算吗?
您不需要long[]数组,只需将值作为longs处理即可。该解决方案就像人们可以想象的那样简单:
int[] iArr = new int[]{2147483646 , 1 , 1};
System.out.println(Arrays.stream(iArr).asLongStream().sum());
Run Code Online (Sandbox Code Playgroud)
long即使所有元素都一样大Integer.MAX_VALUE,也不太可能超出范围,您将需要4294967298个流元素才能达到Long.MAX_VALUE。但是,如果您的流量如此之大且时间充裕,或者以a LongStream为起点,则可以采取BigInteger以下措施:
long[] lArr={ Long.MAX_VALUE, Long.MAX_VALUE, 42 };
System.out.println(Arrays.stream(lArr).mapToObj(BigInteger::valueOf)
.reduce(BigInteger.ZERO, BigInteger::add));
Run Code Online (Sandbox Code Playgroud)
请注意,这对IntStreams 也有效,因为调用时会自动进行从int到的升级,但是如上所述,这很少需要。longBigInteger.valueOf(long)