【问题标题】:Remove duplicates in List<Map<String, Object>> using Streams in java使用 java 中的 Streams 删除 List<Map<String, Object>> 中的重复项
【发布时间】:2021-01-19 11:44:05
【问题描述】:

List&lt;Map&lt;String, Object&gt;&gt; apptlist = jdbcTemplate.queryForList(sb.toString());

这里有一个清单。在该列表中显示了重复的地图。我需要使用 Java 8 Stream 删除这些重复项。有人可以帮帮我吗?

我试过串流这个

Set<Map<String, Object>> set = new HashSet<>();
apptlist.stream().map(s -> s.toLowerCase()).filter(s -> !set.contains(s)).forEach(set::add);

还有这个

apptlist.stream().distinct().collect(Collectors.toList());

但我没有得到任何结果。不过,我得到了重复。

【问题讨论】:

  • 地图的值是否实现equalshashCode
  • 不,先生。在equals 中实现的值。
  • 在什么意义上重复?有些地图是完全平等的吗?即它们的大小相同并且包含完全相同的键值对?
  • “仍然,我得到了重复”你不是。这段代码甚至没有通过编译器。
  • 如何在Map 上调用toLowerCase()?除此之外,Set根据定义不包含重复项。这就是.filter(s -&gt; !set.contains(s)) 毫无意义的原因; add 方法无论如何都不会添加重复项。除非您对“重复”的想法与 Java 不同。但在这种情况下,contains 检查仍然毫无意义,因为它使用与Set.add 相同的“重复”定义。

标签: java collections java-8 stream


【解决方案1】:

您不需要流 API,创建 Set 将消除重复:

Set<Map<String, Object>> set = new HashSet<>(list);

前提是,equals map 具有相同的键,并且映射中与该键关联的值实现了equalshashCode

【讨论】:

    【解决方案2】:

    当它们的长度相等并且对于每个键 map1[key].equals(map2[key])

    String 在 java 中有适当的 equals 方法,但 Object 没有。
    Object 的默认equals 实现比较对象的地址,而不是其字段值。

    当使用正确的 equals 方法(例如 Integer)时,我们可以看到您的代码正常工作

    import java.util.List;
    import java.util.Map;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.stream.Collectors;
    
    class Main {
      public static void main(String[] args) {
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
    
        map1.put("a", 1);
        map1.put("b", 2);
    
        map2.put("a", 1);
        map2.put("b", 2);
    
        List<Map<String, Integer>> mapList = Arrays.asList(map1, map2);
    
        System.out.println(mapList.stream().distinct().collect(Collectors.toList()));
      }
    }
    
    [{a=1, b=2}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多