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

新手上路,请多包涵

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

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

原文由 membersound 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 634
2 个回答

这会起作用,但是 i -> i 正在做一些自动拆箱,这就是它“感觉”奇怪的原因。 mapToInt 将流转换为 IntStream “原始整数值元素”。以下任一项都可以工作,并且可以更好地解释编译器使用您的原始语法在幕后做了什么:

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

原文由 Necreaux 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题