为什么java stream sum api返回相同数据类型的和,而不是更大的数据类型?

为什么java stream sum api返回相同数据类型的和,而不是更大的数据类型?,java,java-stream,Java,Java Stream,我使用Arrays.stream(int arr[]).sum()添加了一些整数。它以int为单位返回截断的和,而实际的和更大且适合long。为什么流API只返回int而不是long 尝试使用小整数,如int myArray[]={1,5,8}; int sum=Arrays.stream(myArray.sum() 很好 但不适用于长整数,其和导致长 下面的场景1工作正常,返回14 int myArray[] = { 1, 5, 8 }; int sum = Arrays.stream(myA

我使用Arrays.stream(int arr[]).sum()添加了一些整数。它以int为单位返回截断的和,而实际的和更大且适合long。为什么流API只返回int而不是long

尝试使用小整数,如int myArray[]={1,5,8}; int sum=Arrays.stream(myArray.sum()

很好

但不适用于长整数,其和导致长

下面的场景1工作正常,返回14

int myArray[] = { 1, 5, 8 };
int sum = Arrays.stream(myArray).sum();
而场景2无法工作,因为总和超过32位。它给出的金额为-105032716,而预期为4189934580

int myArray[] = { 2094967290, 2094967290};
int sum = Arrays.stream(myArray).sum();
long sum = 0L + 2094967290+2094967290;
System.out.println(sum);
为了得到正确的总数,如果我做了下面的操作,我会得到预期的结果4189934580

int myArray[] = { 2094967290, 2094967290};
int sum = Arrays.stream(myArray).sum();
long sum = 0L + 2094967290+2094967290;
System.out.println(sum);

您正在对
int
(s)(一种32位基本数据类型)求和。如果您想要一个
long
,那么求和
long
(s)。这就是原始数学的工作原理

int c = 2094967290 + 2094967290;
System.out.println(c);

System.out.println(2094967290 + 2094967290);
使用
long
(s)

或者像这样的流将在这里产生正确的结果

long sum = Arrays.stream(myArray).mapToLong(Long::valueOf).sum();
或(如本节所述)

但是,
long
也可能溢出(它是64位基本数据类型)。对于任意精度,应使用


这取决于开发人员。你知道要期待什么,你在处理什么数据,更重要的是,你要测试它。在我看来,这与我们如何处理任何
intOne+intTwo
的可能溢出没有什么不同

如果您知道总和将超过
int
范围,则切换到长流(感谢for
asLongStream()
而不是
mapToLong(i->i)
):


asLongStream()
会更简单
asLongStream()
会更简单,而不是
mapToLong
@CarlosHeuberger。我还没有参与到它的规范中,所以我只能猜测:可能他们不想总是做
long
添加(包括转换),即使它显然不需要。因此,选择权留给开发人员,就像简单的添加一样。
BigInteger sum = Arrays.stream(myArray).mapToObj(BigInteger::valueOf)
        .reduce(BigInteger.ZERO, (a, b) -> a.add(b));
long sum = Arrays.stream(myArray).asLongStream().sum();