Java 合并两个列表并移除重复项

3
我有两个列表。
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());
3个回答

0
您可以使用 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());

0

使用映射来管理唯一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());

0
你可以使用 flatMap 来扁平化列表,然后使用 Collectors.toMap 按照 map 的 id 键进行分组,并在新的 ArrayList 中获取 map 的值。
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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接