两个List对象集合
A : code: 编号,name:名称;
B: id,code,name等等;
List lsit1;
List list2;
如何将两个list1跟list2中code相同的合并成一个新的List
基于Monster 组和GPT的调写:
用Java 8的Stream API来完成这个操作。先用stream()方法将两个列表转换成流。然后用filter()方法来过滤出code相同的元素,用map()方法将其转换为新的元素类型,最后用collect()方法将结果收集到一个新的列表中。下面是一个示例代码:
List<Map<String, Object>> list1 = new ArrayList<>();
List<Map<String, Object>> list2 = new ArrayList<>();
// 初始化 list1 和 list2
List<Map<String, Object>> mergedList = Stream.concat(list1.stream(), list2.stream())
.filter(item -> list1.stream().anyMatch(map -> map.get("code").equals(item.get("code")))
&& list2.stream().anyMatch(map -> map.get("code").equals(item.get("code"))))
.map(item -> {
Map<String, Object> map = new HashMap<>();
map.put("code", item.get("code"));
map.put("name1", list1.stream().filter(map1 -> map1.get("code").equals(item.get("code"))).findFirst().orElse(new HashMap<>()).get("name"));
map.put("name2", list2.stream().filter(map1 -> map1.get("code").equals(item.get("code"))).findFirst().orElse(new HashMap<>()).get("name"));
return map;
})
.collect(Collectors.toList());
设两个列表中的元素类型都是Map<String, Object>,并且包含code和name字段。它将会将两个列表中code相同的元素合并到一个新的列表中,并包含它们的name字段。最终的结果将会是一个List<Map<String, Object>>类型的对象。
可以使用列表推导式和字典来实现。
假设A和B中的code是唯一的,可以先将两个列表中的元素转换为字典,以code作为键,然后遍历A中的元素,在B中查找对应的元素,如果存在则将两个元素合并,最后将合并后的元素添加到一个新的列表中即可。
示例代码如下:
复制
dict_a = {item['code']: item for item in list1}
dict_b = {item['code']: item for item in list2}
result = [dict(dict_a[code], **dict_b.get(code, {})) for code in dict_a]
print(result)
其中,dict_a[code]表示从字典dict_a中根据键code获取对应的值,dict_b.get(code, {})表示从字典dict_b中根据键code获取对应的值,如果不存在则返回一个空字典{}。**表示将两个字典合并成一个新的字典。最后使用dict()将合并后的字典转换为一个新的元素,添加到结果列表中。