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());