Estoy tratando con un poco compleja de la lógica que no puedo hacerlo bien. Estoy tratando de reducir una lista que contiene una lista de propiedades en un objeto fusionado uno, la eliminación de duplicados de llaves .
Decir que tengo una Config
clase con los siguientes elementos:
private int index;
private String name;
private Map<String, String> properties;
Este objeto estará en una lista enlazada de objetos, List<Config>
. Si el Config
objeto en el índice 5 tiene una clave / valor properties
de "version = 2", pero el Config
objeto en el índice 1 tiene properties
que contienen "version = 1", que necesita la propiedad en el índice de 5 a ganar. Así que quiero una última Config
(me preocuparé por el name
elemento más adelante) que tiene propiedades fusionadas que reflejan las últimas propiedades en la corriente.
¿Estoy pidiendo demasiado en una sola operación? Hasta ahora he llegado con algo como esto, pero no se compila:
configList.stream()
.map(it -> it.getProperties())
.collect(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(???))))
Cualquier ayuda apreciada!
Si entiendo bien la pregunta, desea obtener todas las propiedades y las Combinar en un mapa y si hay duplicados, que desea dar prioridad a la propiedad del mapa con el valor más alto índice en config.
Esta es la solución que se me ocurrió.
Map<String, String> properties = configList.stream()
.sorted(Comparator.comparingInt(Config::getIndex)) //Sort the configs in ascending order by indexes.
.flatMap(config -> config.properties.entrySet().stream()) //flat map all the properties
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (left, right) -> right)); //collect to a map
Esto Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (left, right) -> right)
es donde sucede la magia.
Dado que ya se solucionó las configuraciones de índice, que siempre tendrá el valor con mayor índice de configuración en la parte inferior y todo lo que hacemos es sobrescribir la clave existente cuando se produce llave duplicada.