Java列表<;地图<;长字符串>&燃气轮机;映射键的group by之和

Java列表<;地图<;长字符串>&燃气轮机;映射键的group by之和,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有一个:List items=new ArrayList() 我想得到一个映射,其中键是按分组的,值是总和 示例:列表 项目0 foo->1 酒吧->2 项目1 foo->4 酒吧->3 结果:地图 foo->5 酒吧->5 我知道如何“长期”做到这一点,但我尝试使用Java8特性发现一种lambda/streaming/groupby方法。有什么想法吗?您可以使用groupingBy收集器: import static java.util.stream.Collectors.

我有一个:
List items=new ArrayList()

我想得到一个映射,其中键是按分组的,值是总和

示例:列表

  • 项目0
    • foo->1
    • 酒吧->2
  • 项目1
    • foo->4
    • 酒吧->3
结果:地图

  • foo->5
  • 酒吧->5

我知道如何“长期”做到这一点,但我尝试使用Java8特性发现一种lambda/streaming/groupby方法。有什么想法吗?

您可以使用
groupingBy
收集器:

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingLong;

items.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(groupingBy(Map.Entry::getKey, summingLong(Map.Entry::getValue)));
或者您可以使用
toMap

import static java.util.stream.Collectors.toMap;

items.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, Long::sum));

可能只是一个输入错误,但是你能重申一下你想要的密钥分组依据是什么吗,因为你说“…其中密钥分组依据是…”。嘿@Misha,你能在导入语句中添加吗?我无法获取要编译的方法引用。是否使用eclipse?eclipse在类型推断方面存在问题(或者至少以前的版本是这样)。但我刚刚在eclipse Mars上试用过,它编译得很好。请注意,
summingLong
解决方案在多个键合并为一个键时可能工作得更快,因为它减少了装箱。@TagirValeev对,但如果重复键很少,则
toMap
会更快