gpt4 book ai didi

Java 8 Streams - 为什么我不能对整数流求和?

转载 作者:搜寻专家 更新时间:2023-10-31 08:07:41 25 4
gpt4 key购买 nike

给定一个整数列表: List<Integer> numbers = Arrays.asList(1,2,3);

为什么我不能像这样总结它们:numbers.stream().sum();

相反,我必须这样做:numbers.stream().mapToInt(e -> e).sum();

我知道mapToInt产生 IntStream , 原始特化。但我还是不明白。为什么不能对整数求和?我知道这个列表有整数,编译器应该能够做同样的事情。毕竟它现在可以推断 lambda 表达式中的类型参数。

好的,整数可能为空,求和会失败。但我可以对此负责并过滤掉 null:

numbers.stream().filter(Objects::nonNull).sum();

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

最佳答案

List 上调用 stream() 将得到一个通用的 Stream,它可以处理任何引用类型,而不仅仅是数字类型。在 Stream 上包含一个 sum 方法是没有意义的,因为对 URL 求和是没有意义的, ClassThread 或任何其他非数字引用类型。

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

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

但这将涉及大量的拆箱和装箱工作。最好将它们相加,方法是将其转换为对 int 进行操作的 IntStream,然后调用 sum()(或 summaryStatistics(),包括计数、平均值、最大值和最小值以及总和)。

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

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

关于Java 8 Streams - 为什么我不能对整数流求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51367853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com