我想总结一个整数列表。它的工作原理如下,但语法感觉不对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
原文由 membersound 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想总结一个整数列表。它的工作原理如下,但语法感觉不对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
原文由 membersound 发布,翻译遵循 CC BY-SA 4.0 许可协议
我建议另外 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();
原文由 Alex Salauyou 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
这会起作用,但是
i -> i
正在做一些自动拆箱,这就是它“感觉”奇怪的原因。mapToInt
将流转换为IntStream
“原始整数值元素”。以下任一项都可以工作,并且可以更好地解释编译器使用您的原始语法在幕后做了什么: