Después de un aplanamiento de Java 8 multinivel mapa Mi resultado esperado está vacía

SAGAR Kalburgi:

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 myMapestá 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);
ernest_k:

Esto es lo que me pasa cuando agrego dos peekllamadas 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);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=277134&siteId=1
Recomendado
Clasificación