当前位置: 首页 > 知识库问答 >
问题:

如何用Java流求和整数列表?

拓拔弘化
2023-03-14

我想对一个整数列表求和。它的工作方式如下,但语法感觉不对。代码是否可以优化?

Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();

共有3个答案

吕俊才
2023-03-14

从文件中

约简操作约简操作(也称为fold)采用一系列输入元素,并通过重复应用组合操作(如求一组数字的和或最大值,或将元素累加到列表中)将它们组合成单个汇总结果。streams类有多种形式的常规约简操作,称为reduce()和collect(),以及多种特殊的约简形式,如sum()、max()或count()。

当然,这样的操作可以很容易地实现为简单的顺序循环,如:

int sum = 0;
for (int x : numbers) {
   sum += x;
}

然而,有充分的理由优选reduce操作,而不是上述的突变积累。reduce不仅“更抽象”--它对流作为一个整体而不是单个元素进行操作--而且只要用于处理元素的函数是关联的和无状态的,适当构造的reduce操作就具有内在的并行化能力。例如,给定一个我们想要求和的数字流,我们可以这样写:

int sum = numbers.stream().reduce(0, (x,y) -> x+y);

或:

int sum = numbers.stream().reduce(0, Integer::sum);

这些还原操作几乎不需要修改就可以安全地并行运行:

int sum = numbers.parallelStream().reduce(0, Integer::sum);

因此,对于一个地图,您可以使用:

integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y);

或:

integers.values().stream().reduce(0, Integer::sum);
沈高峻
2023-03-14

我建议还有2个选择:

integers.values().stream().mapToInt(Integer::intValue).sum();
integers.values().stream().collect(Collectors.summingInt(Integer::intValue));

第二个使用collectors.summingInt()收集器,还有一个summingLong()收集器,您可以与MapTolong一起使用。

第三个选项是:Java 8引入了一个非常有效的longadder累加器,用于加速并行流和多线程环境中的总结。下面是一个示例:

LongAdder a = new LongAdder();
map.values().parallelStream().forEach(a::add);
sum = a.intValue();
穆鸿卓
2023-03-14

这是可行的,但是i->i正在执行一些自动解箱操作,这就是为什么它“感觉”很奇怪的原因。以下任一项都能起作用,并能更好地解释编译器在使用原始语法时所做的工作:

integers.values().stream().mapToInt(i -> i.intValue()).sum();
integers.values().stream().mapToInt(Integer::intValue).sum();
 类似资料:
  • 问题内容: 我很难解决这个问题的解决方案。我正在尝试用Java开发一个程序,该程序需要一个数字,例如321,并找到数字的总和,在这种情况下为3 + 2 + 1 =6。我需要任何三个数字的所有数字将它们加在一起,并使用%剩余符号存储该值。这让我感到困惑,我想感谢任何人的想法。 问题答案: 输出量

  • 我有以下列表: 我需要计算累计总和-列表含义 我想使用Java流API进行计算,以便我可以使用Spark实现它以进行大数据计算。我在JavaStreams中很天真,我尝试了几个表达式,但没有一个是有效的,等效的结构代码应该是这样的:

  • 是否可以对流进行求和、平均并将其转换为新对象。我有个目标 现在我想得到这个对象列表的平均值和总和(代码总和价格和代码平均价格) 然后我想创建一个新对象(页脚 这就是我现在所拥有的,它可以工作,但是我要通过两次流。我想要一个方法,我可以通过一次流来做到这一点。 有没有更好的方法做到这一点而不必重复这一点。谢谢

  • 我有一个地图列表,并希望对某些列进行分组和求和。 地图列表:

  • 如何使用8流对列表中的每个元素Java求和? 例如,我在一个列表中有3个不同的列表,我试图对每个列表中的每个元素求和,然后创建另一个列表。我不熟悉Java 8,尝试使用流API解决一些问题: 我正在努力实现的输出:

  • 我在编写一个程序时遇到了问题,该程序需要输入32677之类的数字,取出奇数并将它们相加。因为位置0中的数字是3。因为3不能被2整除,所以存储3并将其添加到和中。检查位置1中的数字,即2。2可以被2整除,所以不要存储它,丢弃它并检查下一个数字。 检查位置2的数字,即6,6可被2整除,因此将其丢弃并检查下一个数字。检查位置3的数字,即7。检查7是否能被2整除,存储7并将其与奇数相加,即3。总数是10。