如何使用java流对整数列表求和?

2022-08-31 04:29:48

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

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

答案 1

这将起作用,但是正在做一些自动开箱,这就是为什么它“感觉”奇怪。 将流转换为“原始整数值元素”。以下任一方法都可以工作,并更好地解释编译器在后台使用原始语法执行的操作:i -> imapToIntIntStream

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

答案 2

我建议另外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();

推荐