【问题标题】:Java Combine two list with by removing duplicatesJava通过删除重复项将两个列表与
【发布时间】:2021-01-16 19:20:13
【问题描述】:

我有两个列表

List<Map<String,Object>> list1 = new ArrayList<>();
List<Map<String,Object>> list2 = new ArrayList<>();

列表是地图列表,每个地图如下所示

name-> XXX
age->yyy
id->zzz

现在我想将这些组合成一个列表,并根据地图的id 删除重复项。

我正在使用下面的列表来组合列表,但不确定如何根据地图的值删除重复项

List<Map<String,Object>> newList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());

【问题讨论】:

    标签: java collections java-stream


    【解决方案1】:

    您可以使用TreeMap 创建谓词closure 以过滤具有唯一"id" 的映射

    static Predicate<Map<String, Object>> predicate() {
        var set = new TreeSet<>();
        return m -> set.add(m.get("id")); 
    }
    
    List<Map<String,Object>> list1 = new ArrayList<>();
    List<Map<String,Object>> list2 = new ArrayList<>();
    List<Map<String, Object>> newList = Stream.concat(list1.stream(), list2.stream())
                    .filter(predicate())
                    .collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      您可以使用flatMap 将列表展平,然后使用Collectors.toMap 按地图的id 键分组,然后在新的ArrayList 中获取地图的值

      List<Map<String,Object>> newList = 
         new ArrayList<>(
             Stream.of(list1, list2)
                  .flatMap(l -> l.stream())
                  .collect(Collectors.toMap(m -> m.get("id"), e -> e, (a, b) -> a)).values());
      

      【讨论】:

        【解决方案3】:

        这可以更简单地使用映射来管理唯一 ID 作为键:

        // Use LinkedHashMap if order is needed
        Map<Object, Map<String, Object>> megaMap = new HashMap<>();
        Stream.concat(list1.stream(), list2.stream())
                .forEach(map -> megaMap.computeIfAbsent(map.get("id"), id -> map));
        
        List<Map<String, Object>> newList = new ArrayList<>(megaMap.values());
        

        使用Collectors.toMap()可以生成相同的地图:

        Map<Object, Map<String, Object>> megaMap2 = Stream.concat(list1.stream(), list2.stream())
                .collect(Collectors.toMap(m -> m.get("id"), 
                                          Function.identity(), 
                                          (v1, v2) -> v1, 
                                          HashMap::new));
        newList = new ArrayList<>(megaMap2.values());
        

        【讨论】:

          猜你喜欢
          • 2015-07-20
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 2015-10-06
          • 1970-01-01
          相关资源
          最近更新 更多