【问题标题】:Java8 Stream List<Map<String,Object>> groupingBy and counting valueJava8 Stream List<Map<String,Object>> groupingBy 和计数值
【发布时间】:2019-08-13 02:18:07
【问题描述】:

我想得到像 { "key1" : 4 ,"key2" :2 }

这样的结果

我知道我可以使用 map 和 groupby 等

list.stream()
    .map(map -> map2Entity(map))
    .collect(Collectors.groupingBy(Entity::getKey,Collectors.summarizingInt(Entity::getCnt)) )

这是我的代码以及如何实现 (todo) 代码

public void test() {
    List<Map<String, Object>> list = Arrays.asList(
            createNewMap("key1", 1),
            createNewMap("key2", 2),
            createNewMap("key1", 3)
    );
    // i want get result like {"key1":4,"key2":2}
    // how can i get the result don't use map()
    list.stream()
                .collect(Collectors.groupingBy(this::getKey),....(todo));
}

private String getKey(Map<String,Object> map){
    return  (String) map.get("key");
}

private Map<String, Object> createNewMap(String key, Integer val) {
    Map<String, Object> map = new HashMap<>();
    map.put("key", key);
    map.put(key, val);
    return map;
}

【问题讨论】:

  • 我认为您的createNewMap 方法中的这一行map.put("key", key); 是错误的。它的目的是什么?

标签: java lambda java-8 java-stream collectors


【解决方案1】:

您必须将flatMap 运算符与groupingBy 收集器一起使用。这是它的外观。

Map<String, Integer> keyToSumValuesMap = list.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey, 
        Collectors.summingInt(Map.Entry::getValue)));

此外,不要使用 Object 类型来表示整数,因为这不是类型安全的。考虑声明方法级别的泛型来克服这个问题。这是它的外观。

private static <S, T> Map<S, T> createNewMap(S key, T val) {
    Map<S, T> map = new HashMap<>();
    map.put(key, val);
    return map;
}

现在的输出如下所示:

{key1=4, key2=2}

【讨论】:

  • …或替换,例如createNewMap("key2", 2)Collections.singletonMap("key2", 2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多