首页 > 解决方案 > 为什么 java stream sum api 返回相同数据类型的总和而不是更大的总和?

问题描述

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

尝试过像 int myArray[] = { 1, 5, 8 }; 这样的小整数 int sum = Arrays.stream(myArray).sum();

工作正常。

但不适用于总和为 long 的较长整数。

下面的场景 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();

并得到正确的总和,如果我在下面做,我会得到预期的结果 4189934580

long sum = 0L + 2094967290+2094967290;
System.out.println(sum);

标签: javajava-stream

解决方案


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

如果您知道总和将超出int范围,则切换到长流(感谢Carlos Heuberger代替asLongStream()mapToLong(i -> i)

long sum = Arrays.stream(myArray).asLongStream().sum();

推荐阅读