Estoy tratando de actualización de la clave en el interior de mapa que es el valor de nivel superior del mapa, por eso me he dado 3 fragmentos de código aquí primero 2 están trabajando y tratando de entender por qué una tercera no está funcionando.
Esta es la estructura de la variable mapOfMap, valor clave clasificado se puede sustituir por clases reales.
Map<TopLevelMapKey, Map<InnerMapKey, InnerMapValue>> mapOfMap;
Se trata de obras de la primera versión fina.
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))));
Esta es la segunda versión, probablemente el mejor enfoque aquí, también funciona bien.
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 ))
));
Éste no está funcionando, devuelve vaciar mapa, no es capaz de entender por qué. En este nivel Estoy llamando a cobro revertido sobre la parte superior y la recolección Mapa resultado en HashMap proveedor :: nueva, en el acumulador Estoy llamando a un mapa más cobrar más de interior que estoy recogiendo en TreeMap, ahora espero acumulador de salida que se combinan en el nivel superior Mapa HashMap usando :: putAll combinador siempre que exista.
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);
Usted está haciendo caso omiso del valor de retorno de su interior collect()
. Usted debe poner que en el dado hashMap
valor:
mapOfMap.entrySet().stream()
.collect(HashMap::new,
(hashMap, topMap) -> {
TreeMap<TopLevelMapKey, InnerMapValue> value = topMap.getValue()
.entrySet().stream()
.collect(TreeMap::new,
(treeMap, innerMap) -> treeMap.put(innerMap.getKey().getUpdatedKey(), innerMap.getValue()),
TreeMap::putAll);
hashMap.put(topMap.getKey(), value);
},
HashMap::putAll);