Eu tenho Stream<Map<String, String>>
onde cada mapa é como um disco separado e contém duas entradas:
- Id carro ( "ID", "1003")
- Quilômetros ( "KMI", "500")
Esta lista pode conter mapas que são duplicados de uma forma que 2 ou mais mapas poderia ter o mesmo valor de entrada id carro. Basicamente isto: entry1.get ( "ID") == entry2.get ( "ID"). o que eu quero fazer é remover mapas com ids duplicados, mas depois também para mesclar valores KMI juntos. esta:
{ "ID": "1003", "KMI": "500"}, { "ID": "1003", "KMI": "400"}, { "ID": "1004", "KMI":" 200" }
deve tornar-se o seguinte:
{ "Id": "1003", "KMI": "900"}, { "id": "1004", "KMI": "200"}
Eu tentei fazê-lo com correntes API só, mas eu não pode envolver minha cabeça em torno deste. Eu tentei modificar um exemplo semelhante que estava tendo Lista de objetos aqui é o que eu tenho até agora:
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;
})
)
);
Eu peguei de onde OP esquerda. Eu modifiquei o seu um pouco de lógica para retornar o que você queria. Ter um olhar para ele. Espero que ajude
Collectors.toMap retornará um mapa que terá ID
como chave e sum of KMI
de Function.identity()
casos. Assim, o retorno seria Map<Object,Map<String,String>>
. Porque resultado esperado é Stream<Map<String,String>
, I adicionado .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);