То, что вы ищете, это Collectors.groupingBy :
Map<String, Long> summary = Stream
.of(
new HashMap<String, String>() {{
put("ID", "1003");
put("KMI", "500");
}},
new HashMap<String, String>() {{
put("ID", "1003");
put("KMI", "400");
}},
new HashMap<String, String>() {{
put("ID", "1004");
put("KMI", "200");
}}
)
.collect(Collectors.groupingBy(
m -> m.get("ID"),
Collectors.summingLong(m -> Long.valueOf(m.get("KMI")))
));
System.out.println(summary);
Кроме того, вы можете заменить карту классом, скажем Summary
:
public class Summary {
public Summary(String id, Long kmi) {
this.id = id;
this.kmi = kmi;
}
private String id;
private Long kmi;
public String getId() {
return id;
}
public Long getKmi() {
return kmi;
}
}
А затем используйте:
Map<String, Long> summary = Stream
.of(
new Summary("1003", 500L),
new Summary("1003", 400L),
new Summary("1004", 200L)
)
.collect(Collectors.groupingBy(
s -> s.getId(),
Collectors.summingLong(s -> s.getKmi())
));
System.out.println(summary);
Отпечатки: {1004=200, 1003=900}