Java通过删除重复项将两个列表与合并

Java通过删除重复项将两个列表与合并,java,collections,java-stream,Java,Collections,Java Stream,我有两张单子 List<Map<String,Object>> list1 = new ArrayList<>(); List<Map<String,Object>> list2 = new ArrayList<>(); 现在,我想将它们合并到一个列表中,并根据地图的id删除重复项 我用下面的来组合列表,但不知道如何根据地图的值删除重复项 List<Map<String,Object>> newLi

我有两张单子

List<Map<String,Object>> list1 = new ArrayList<>();
List<Map<String,Object>> list2 = new ArrayList<>();
现在,我想将它们合并到一个列表中,并根据地图的
id
删除重复项

我用下面的来组合列表,但不知道如何根据地图的值删除重复项

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

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

静态谓词(){
变量集=新树集();
返回m->set.add(m.get(“id”));
}
List list1=new ArrayList();
List list2=新的ArrayList();
List newList=Stream.concat(list1.Stream(),list2.Stream())
.filter(谓词())
.collect(Collectors.toList());

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

您可以使用
flatMap
展平列表,然后使用
收集器。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());
List newList=
新阵列列表(
流(列表1、列表2)
.flatMap(l->l.stream())
.collect(Collectors.toMap(m->m.get(“id”),e->e,(a,b)->a)).values();
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());
// 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());
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());
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());