java - Java 8 Streams - 为什么我不能对整数流求和?
问题描述
给定一个整数列表:
List<Integer> numbers = Arrays.asList(1,2,3);
为什么我不能像这样总结它们:numbers.stream().sum();
?
相反,我必须这样做:numbers.stream().mapToInt(e -> e).sum();
我知道这mapToInt
会产生IntStream
原始专业化。但我还是不明白。为什么不能对整数求和?我知道这个列表有整数,编译器应该能够做到这一点。毕竟它现在可以推断 lambda 表达式中的类型参数。
好的,一个 Integer 可以为 null 并且 sum 会失败。但我可以为此负责并过滤掉空值:
numbers.stream().filter(Objects::nonNull).sum();
为什么我不能对整数流求和?
解决方案
调用stream()
aList
会给你一个通用的Stream
,它可以处理任何引用类型,而不仅仅是数字类型。在 上包含sum
方法Stream
没有意义,因为 sum URL
s、Class
es、Thread
s 或任何其他非数字引用类型没有意义。
您可以通过调用对元素求和reduce
:
numbers.stream().reduce(0, (a, b) -> a + b)
但这将涉及大量的拆箱和装箱。最好将它们按您所拥有的方式求和,方法是将其转换为IntStream
对 s 进行操作int
的 ,并调用sum()
(或summaryStatistics()
,其中包括计数、平均值、最大值和最小值以及总和)。
您甚至可以使用IntStream.of
并避免将值装箱一次。
IntStream.of(1, 2, 3).sum()
推荐阅读
- reactjs - 如何更改我在 ReactJS 中动态状态的余额
- kubernetes - Kubernetes入口到在同一主机上运行的pod?
- jdbc - 使用 JDBC 的 db2 load 命令失败
- python - 如何将网页中的数据获取到 iseries 并使用 Python 处理它
- kubernetes - 我可以在集群中使用不同版本的 cassandra 吗?
- node.js - Twilio 在 Firebase 云功能中不起作用
- javascript - 搜索 MySQL & PHP 生成的 UL
- python - 用于多个不同类型数组的 Numpy.i 类型映射
- dynamics-ax-2012-r3 - 学习批处理作业参数 AX 2012
- c# - 发布 WebAPI 项目