首页 > 解决方案 > 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();

为什么我不能对整数流求和?

标签: javajava-8java-stream

解决方案


调用stream()aList会给你一个通用的Stream,它可以处理任何引用类型,而不仅仅是数字类型。在 上包含sum方法Stream没有意义,因为 sum URLs、Classes、Threads 或任何其他非数字引用类型没有意义。

您可以通过调用对元素求和reduce

numbers.stream().reduce(0, (a, b) -> a + b)

但这将涉及大量的拆箱和装箱。最好将它们按您所拥有的方式求和,方法是将其转换为IntStream对 s 进行操作int的 ,并调用sum()(或summaryStatistics(),其中包括计数、平均值、最大值和最小值以及总和)。

您甚至可以使用IntStream.of并避免将值装箱一次。

IntStream.of(1, 2, 3).sum()

推荐阅读