我有Stream<Map<String, String>>
其中每个 map 就像一个单独的记录并包含两个条目:
- 汽车 ID(“ID”、“1003”)
- 公里(“KMI”、“500”)
此列表可能包含重复的 map ,其中 2 个或更多 map 可能具有相同的汽车 ID 条目值。 基本上是这样的:entry1.get(“ID”)==entry2.get(“ID”)。我想要做的是删除具有重复 ID 的 map ,然后还将 KMI 值合并在一起。 这个:
{"ID":"1003","KMI":"500"}, {"ID":"1003","KMI":"400"}, {"ID":"1004","KMI":"200"}
应该变成这样:
{"ID":"1003","KMI":"900"}, {"ID":"1004","KMI":"200"}
我尝试过单独使用流 API 来实现这一点,但我无法理解这一点。我尝试修改一个类似的示例,该示例具有对象列表 这是我到目前为止得到的:
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;
})
)
);
最佳答案
我从 OP 离开的地方接起。我稍微修改了您的逻辑以返回您想要的内容。看看它。希望对您有帮助
Collectors.toMap 将返回一个包含 ID
的 map 作为 key 和 sum of KMI
对于 Function.identity()
案例。所以返回将是 Map<Object,Map<String,String>>
。因为预期输出是 Stream<Map<String,String>
,我添加了.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);
关于java - 在java中将部分 HashMap 重复项合并到新的数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861974/