我想使用Map<String,Map<String,Integer>>
将Map<String,Integer>
转换为Stream
。
这就是要抓住的地方(以及为什么我似乎无法弄清楚):
我想通过相应Map的键值将我的Integer-Values分组。因此,请澄清一下:
我有类似的条目:
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
类和诸如summingInt
和groupingBy
之类的方法,您应该能够完成此任务。不过,我似乎无法找出解决此问题的正确方法。
应注意,保证所有内部Map
始终具有相同的密钥,无论其Integer
的值为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())));
});
但是如何添加求和部分呢?
答案 0 :(得分:8)
这应该有效:
首先为所有内部映射的条目创建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)));