Tengo el siguiente mapa multinivel:
Map<String, List<Map<String, Map<String, Map<String, Map<String, String>>>>>> input =
ImmutableMap.of("A",
ImmutableList.of(ImmutableMap.of("2",
ImmutableMap.of("3",
ImmutableMap.of("4",
ImmutableMap.of("5", "a"))))));
En resumen será como
{
"A":[{"2":{"3":{"4":{"5":"a"}}}}],
"B":[{"2":{"3":{"4":{"5":"b"}}}}]
}
Mi requisito es construir un mapa de la forma
{
"A":"a",
"B":"b"
}
Probé el siguiente código, pero por alguna razón myMap
está vacía siempre a pesar de que estoy poblarlo. ¿Qué me estoy perdiendo?
Map<String, String> myMap = new HashMap<>();
input.entrySet()
.stream()
.map(l -> l.getValue().stream().map(m -> m.get(m.keySet().toArray()[0]))
.map(n -> n.get(n.keySet().toArray()[0]))
.map(o -> o.get(o.keySet().toArray()[0]))
.map(p -> myMap.put(l.getKey(), p.get(p.keySet().toArray()[0])))).collect(Collectors.toList());
System.out.println(myMap);
Esto es lo que me pasa cuando agrego dos peek
llamadas a su tubería:
input.entrySet().stream()
.peek(System.out::println) //<- this
.map(l -> ...)
.peek(System.out::println) //<- and this
.collect(Collectors.toList());
salida:
A=[{2={3={4={5=a}}}}]
java.util.stream.ReferencePipeline$3@d041cf
Si se observa el problema, que está recogiendo las corrientes, y estas corrientes no se ejecutan a través de una llamada a una operación de la terminal ... Cuando intento añadir algo parecido .count()
a la corriente interna, el resultado esperado se produce:
...
.map(l -> l.getValue().stream().map(m -> m.get(m.keySet().toArray()[0]))
.map(n -> n.get(n.keySet().toArray()[0]))
.map(o -> o.get(o.keySet().toArray()[0]))
.map(p -> myMap.put(l.getKey(), p.get(p.keySet().toArray()[0])))
.count()) //just an example
...
Ahora, supongo que sabes que una operación de terminal necesita ser llamado para las intermedias para correr.
En un intento bastante desesperada para simplificar el código, como la corriente parece que sea simplemente difícil de leer, pensé que podría estar interesado en este, que asume que hay recogida está vacía en el árbol, pero al menos addrsses el registro como un objeto y no una colección de registros (pero estoy seguro de que no hay código se verá limpio para que en el fondo del mapa de los mapas).
String key = input.keySet().iterator().next();
String value = input.entrySet().iterator().next()
.getValue().get(0)
.values().iterator().next()
.values().iterator().next()
.values().iterator().next()
.values().iterator().next();
myMap.put(key, value);