使用流将 Map<String,Map<String,Integer>> 转换为 Map<String,Integer>
Converting a Map<String,Map<String,Integer>> to Map<String,Integer> using streams
我想使用 Stream
将 Map<String,Map<String,Integer>>
转换为 Map<String,Integer>
。
关键在于(以及为什么我似乎无法理解):
我想按相应地图的键值对我的整数值进行分组。所以,澄清一下:
我有这样的条目:
Entry 1: ["A",["a",1]]
Entry 2: ["B",["a",2]]
Entry 3: ["B",["b",5]]
Entry 4: ["A",["b",0]]
我想将该结构转换为以下结构:
Entry 1: ["a",3]
Entry 2: ["b",5]
我认为使用 Collectors
class 以及 summingInt
和 groupingBy
等方法您应该能够完成此任务。不过,我似乎想不出解决这个问题的正确方法。
需要注意的是,所有内部 Map
都保证始终具有相同的键,或者 Integer
-value 0 或者 sth > 0。(例如 "A"并且 "B" 将始终拥有相同的 5 个键)
到目前为止我尝试过的一切几乎都没有结束。我知道,如果没有求和部分,我可以这样处理:
Map<String,Integer> map2= new HashMap<String,Integer>();
map1.values().stream().forEach(map -> {
map2.putAll(map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue())));
});
但是求和部分怎么加呢?
这应该有效:
首先创建一个Stream
所有内部映射的条目,然后将条目按键分组并对具有相同键的值求和。
Map<String,Integer> map2 =
map1.values()
.stream()
.flatMap(m -> m.entrySet().stream()) // create a Stream of all the entries
// of all the inner Maps
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));
我想使用 Stream
将 Map<String,Map<String,Integer>>
转换为 Map<String,Integer>
。
关键在于(以及为什么我似乎无法理解):
我想按相应地图的键值对我的整数值进行分组。所以,澄清一下:
我有这样的条目:
Entry 1: ["A",["a",1]]
Entry 2: ["B",["a",2]]
Entry 3: ["B",["b",5]]
Entry 4: ["A",["b",0]]
我想将该结构转换为以下结构:
Entry 1: ["a",3]
Entry 2: ["b",5]
我认为使用 Collectors
class 以及 summingInt
和 groupingBy
等方法您应该能够完成此任务。不过,我似乎想不出解决这个问题的正确方法。
需要注意的是,所有内部 Map
都保证始终具有相同的键,或者 Integer
-value 0 或者 sth > 0。(例如 "A"并且 "B" 将始终拥有相同的 5 个键)
到目前为止我尝试过的一切几乎都没有结束。我知道,如果没有求和部分,我可以这样处理:
Map<String,Integer> map2= new HashMap<String,Integer>();
map1.values().stream().forEach(map -> {
map2.putAll(map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue())));
});
但是求和部分怎么加呢?
这应该有效:
首先创建一个Stream
所有内部映射的条目,然后将条目按键分组并对具有相同键的值求和。
Map<String,Integer> map2 =
map1.values()
.stream()
.flatMap(m -> m.entrySet().stream()) // create a Stream of all the entries
// of all the inner Maps
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));