java - 在java中将部分 HashMap 重复项合并到新的数组列表

标签 java java-8 java-stream

我有Stream<Map<String, String>>其中每个 map 就像一个单独的记录并包含两个条目:

  1. 汽车 ID(“ID”、“1003”)
  2. 公里(“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/

相关文章:

java - 为什么这个流不能并行运行?

java - 使用 Hibernate 从数据库检索列表时出现 ClassCastException

java - fannj 库不起作用

java - Java中的分布式计数信号量

java - 使用 Java 流从集合中查找最小和最大数字

java-8 - 使用 Java 8 流在 LocalDate 属性的对象列表中查找最近的日期

java - 如何使用 Lambda 和 Streams 查找 Java 中的 2 个单词是否是字谜?

java - 将数据发送到 php 脚本并通过 android 保存在 mysql 表中时,加号变为空格

java - 在线提交时Java代码错误"NZEC"

java - 使用函数接口(interface)抽象公共(public)代码的问题