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

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

当前回答

这将是对int类型数组求和的最短方法(对于长数组LongStream,对于双数组DoubleStream等等)。不过,并不是所有的基元整数或浮点类型都有Stream实现。

IntStream.of(integers).sum();

其他回答

IntStream.of(1, 2, 23).sum();
IntStream.of(1, 2, 23,1, 2, 23,1, 2, 23).max().getAsInt();

你可以使用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);

我建议另外两种选择:

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();

可以使用collect方法添加整数列表。

List<Integer> list = Arrays.asList(2, 4, 5, 6);
int sum = list.stream().collect(Collectors.summingInt(Integer::intValue));

这将工作,但i -> i正在做一些自动开箱,这就是为什么它“感觉”奇怪。mapToInt将流转换为“原始int值元素”的IntStream。下面的任何一个都可以工作,并且更好地解释编译器在你的原始语法下所做的事情:

integers.values().stream().mapToInt(i -> i.intValue()).sum();
integers.values().stream().mapToInt(Integer::intValue).sum();