我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
当前回答
可以使用reduce()对整数列表求和。
int sum = integers.values().stream().reduce(0, Integer::sum);
其他回答
可以使用collect方法添加整数列表。
List<Integer> list = Arrays.asList(2, 4, 5, 6);
int sum = list.stream().collect(Collectors.summingInt(Integer::intValue));
你可以使用reduce方法:
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y);
or
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum);
这将工作,但i -> i正在做一些自动开箱,这就是为什么它“感觉”奇怪。mapToInt将流转换为“原始int值元素”的IntStream。下面的任何一个都可以工作,并且更好地解释编译器在你的原始语法下所做的事情:
integers.values().stream().mapToInt(i -> i.intValue()).sum();
integers.values().stream().mapToInt(Integer::intValue).sum();
我建议另外两种选择:
integers.values().stream().mapToInt(Integer::intValue).sum();
integers.values().stream().collect(Collectors.summingInt(Integer::intValue));
第二个使用collections . summingint()收集器,还有一个summingLong()收集器,您可以将其与mapToLong一起使用。
第三个选择:Java 8引入了非常有效的LongAdder累加器,旨在加快并行流和多线程环境中的汇总速度。这里有一个例子:
LongAdder a = new LongAdder();
map.values().parallelStream().forEach(a::add);
sum = a.intValue();
希望这能帮助那些在清单上有物品的人。
如果您有一个对象列表,并且想要对该对象的特定字段求和,请使用下面的方法。
List<ResultSom> somList = MyUtil.getResultSom();
BigDecimal result= somList.stream().map(ResultSom::getNetto).reduce(
BigDecimal.ZERO, BigDecimal::add);