Я пытаюсь обновить ключ во внутренней карте, которая является значением карты верхнего уровня, для этого я привел здесь 3 фрагмента кода, первые 2 работают и пытаются понять, почему третий не работает.
Это структура переменной mapOfMap, классифицированное значение ключа может быть заменено реальными классами.
Map<TopLevelMapKey, Map<InnerMapKey, InnerMapValue>> mapOfMap;
Это первая версия, работает нормально.
mapOfMap
.entrySet()
.stream()
.forEach(topMap -> map
.put(topMap.getKey(),
topMap.getValue()
.entrySet()
.stream()
.collect(Collectors.toMap(
innerMapEntry -> innerMapEntry.getKey().getUpdatedKey, Map.innerMapEntry::getValue,
(v1, v2) -> {
throw new RuntimeException(" Exception in merging, duplicates not allowed.");},
TreeMap::new))));
Это вторая версия, вероятно, лучший подходздесь также работает нормально.
mapOfMap
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
topMap -> topMap.getValue()
.entrySet()
.stream()
.collect(Collectors.toMap( innerMapEntry -> innerMapEntry.getKey().getUpdatedKey,
Map.Entry::getValue,
v1, v2) -> {
throw new RuntimeException(" Exception in merging, duplicates not allowed.");},
TreeMap::new ))
));
Этот не работает, он возвращает пустую карту, не в состоянии понять, почему.В этом случае я вызываю метод сбора данных на карте верхнего уровня и собираю результат в поставщике HashMap :: new, в аккумуляторе я вызываю еще один способ сбора данных на внутренней карте, который я собираю в TreeMap, теперь я ожидаю, что выходные данные аккумулятора будут объединены в карте верхнего уровня.используя HashMap :: putAll, предоставленный там.
mapOfMap
.entrySet()
.stream()
.collect(HashMap::new,
(hashMap, topMap) ->
topMap.getValue()
.entrySet()
.stream()
.collect( TreeMap::new,
(treeMap, innerMap) -> treeMap.put(innerMap.getKey().getUpdatedKey, innerMap.getValue()),
TreeMap::putAll),
HashMap::putAll);