Quiero convertir:
Map<String, Map<String, List<Map<String, String>>>> inputMap
a:
Map<String, Map<String, CustomObject>> customMap
inputMap
se proporciona en la configuración y está listo, pero necesito customMap
formatear. CustomObject se derivará del List<Map<String, String>>
uso de pocas líneas de código en una función.
He intentado una forma normal de iterar el mapa de entrada y copiar valores clave en customMap. ¿Hay alguna manera eficiente de hacerlo usando Java 8 o algún otro atajo?
Map<String, Map<String, List<Map<String, String>>>> configuredMap = new HashMap<>();
Map<String, Map<String, CustomObj>> finalMap = new HashMap<>();
for (Map.Entry<String, Map<String, List<Map<String, String>>>> attributeEntry : configuredMap.entrySet()) {
Map<String, CustomObj> innerMap = new HashMap<>();
for (Map.Entry<String, List<Map<String, String>>> valueEntry : attributeEntry.getValue().entrySet()) {
innerMap.put(valueEntry.getKey(), getCustomeObj(valueEntry.getValue()));
}
finalMap.put(attributeEntry.getKey(), innerMap);
}
private CustomObj getCustomeObj(List<Map<String, String>> list) {
return new CustomObj();
}
java
collections
java-8
java-stream
jinete Fantasma
fuente
fuente
Respuestas:
Una solución es transmitir el
entrySet
deinputMap
, y luego usarCollectors#toMap
dos veces (una para el exteriorMap
y otra para el interiorMap
):fuente
{}
y la declaración de devolución en la lambda, algo como esto:.collect(Collectors.toMap(Function.identity(), entry -> entry.getValue() .entrySet() .stream() .collect(Collectors.toMap(Function.identity(), entry -> getCustomeObj(entry.getValue()))); ));
Podría transmitir, pero eso no se verá legible; al menos para mi Entonces, si tienes un método:
aún podría usar la
java-8
sintaxis, pero en una forma diferente:Si puede hacer el mapa interno
immutable
, podría hacerlo aún más corto:fuente
La transmisión en mi humilde opinión no es tan mala idea. No hay malas herramientas. Depende de cómo los estés usando.
En este caso particular, extraería el patrón repetitivo en un método de utilidad:
El método anterior se puede implementar utilizando cualquier enfoque, aunque creo que
Stream API
encaja bastante bien aquí.Una vez que haya definido el método de utilidad, puede usarse de la siguiente manera:
La transformación real es efectivamente un trazador de líneas. Así, con adecuado
JavaDoc
paratransformValues
el método del código de resultado es bastante legible y fácil de mantener.fuente
¿Qué tal
Collectors.toMap
para las entradas tanto a nivel externo como interno como:fuente