Tengo Stream<Map<String, String>>
Cada mapa es como un registro separado y contiene dos entradas:
- Id coche ( "ID", "1003")
- Kilómetros ( "KMI", "500")
Esta lista puede contener mapas que son duplicados de una manera que 2 o más mapas pueden tener el mismo valor de entrada Identificación del coche. Básicamente esto: entry1.get ( "ID") == entry2.get ( "ID"). lo que quiero hacer es quitar mapas con identificadores duplicados, pero luego también para combinar los valores de KMI juntos. esta:
{ "ID": "1003", "KMI": "500"}, { "ID": "1003", "KMI": "400"}, { "ID": "1004", "KMI":" 200" }
debe convertirse en esto:
{ "ID": "1003", "KMI": "900"}, { "ID": "1004", "KMI": "200"}
He tratado de hacerlo con corrientes API solo, pero no puedo envolver mi cabeza alrededor de esto. He intentado modificar un ejemplo similar que estaba teniendo Lista de objetos aquí es lo que tengo hasta ahora:
List<Map<String, String>> result = new ArrayList<>(
queryKmAll.collect(
Collectors.toMap(a1 -> a1.get("ID")), Function.identity(), (Map<String, String> m2, Map<String, String> m1) -> {
m1.put("KMI", String.valueOf(Double.parseDouble(m1.get("KMI")) + Double.parseDouble(m2.get("KMI"))));
return m1;
})
)
);
He recogido desde donde dejó OP. He modificado un poco su lógica para devolver lo que quería. Échale un vistazo. Espero eso ayude
Collectors.toMap devolverá un mapa que tendrá ID
como llave y sum of KMI
de Function.identity()
casos. Por lo que el retorno sería Map<Object,Map<String,String>>
. Dado que la salida esperada es Stream<Map<String,String>
, añadí .values().stream()
.
Stream<Map<String, String>> result = queryKmAll.collect(Collectors.toMap(a1 -> a1.get("ID"),
Function.identity(), (Map<String, String> m2, Map<String, String> m1) -> {
m1.put("KMI",
String.valueOf(Double.parseDouble(m1.get("KMI")) + Double.parseDouble(m2.get("KMI"))));
return m1;
})).values().stream();
result.forEach(System.out::println);