java - 为什么 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);
解决方案
这取决于开发人员。你知道会发生什么,你正在处理什么数据,更重要的是,你测试它。在我看来,这与我们处理 any 可能溢出的方式没有什么不同intOne + intTwo
。
如果您知道总和将超出int
范围,则切换到长流(感谢Carlos Heuberger代替asLongStream()
)mapToLong(i -> i)
:
long sum = Arrays.stream(myArray).asLongStream().sum();
推荐阅读
- r - 如何在森林图上添加透明的灰色条纹?
- asp.net-core - ASP.NET Core 2.1 使用依赖于 WebSocket 中间件的每个传入消息来处理 ServiceScope 的使用
- python - Python Pandas:将 2 个字段日期 + 时间转换为 1 个日期时间字段
- c# - 尝试使用 20 GB 的 .pst 文件登录 RDOPstStore
- java - 多平台分布式日志聚合工具
- c# - 使用多个带有 into 的 LINQ 语句,因为左外连接的 DefaultIfEmpty() 不起作用
- android - UnsatisfiedLinkError:缺少 libmodpdfium.so
- c++ - 优先 gRPC 调用以避免服务器过载
- c# - 在 C# 中使用用户的密钥通过 sha1 算法进行散列
- php - 准备好的语句中的 bind_param() 错误报告