map2Entit-6ren">
gpt4 book ai didi

Java8 Stream List> groupingBy和计数值

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:50 25 4
gpt4 key购买 nike

我想要得到像 { "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;
}

最佳答案

您必须将 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}

关于Java8 Stream List<Map<String,Object>> groupingBy和计数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57470328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com