java 两个 list<map>个数不同 找到map 中不同的key 和value 示例 的多种方法实现工具类实现
时间: 2023-05-24 13:03:29 浏览: 218
封装ResultSet结果集
可以使用Java 8提供的Stream API来实现这个功能,具体代码如下:
```java
import java.util.*;
public class MapDiffUtil {
/**
* 找到两个list中不同的key和value
* @param mapList1 第一个map列表
* @param mapList2 第二个map列表
* @return 返回不同的key-value对
*/
public static Set<Map.Entry<String, Object>> diff(List<Map<String, Object>> mapList1, List<Map<String, Object>> mapList2) {
// 将两个列表转换为一个Map,key为map中的key,value为map中对应的value列表
Map<String, List<Object>> map1 = convertToMap(mapList1);
Map<String, List<Object>> map2 = convertToMap(mapList2);
// 找到key相同但是value不同的key-value对
Set<Map.Entry<String, Object>> result = new HashSet<>();
for (Map.Entry<String, List<Object>> entry : map1.entrySet()) {
String key = entry.getKey();
List<Object> values1 = entry.getValue();
List<Object> values2 = map2.getOrDefault(key, Collections.emptyList());
for (int i = 0; i < values1.size() && i < values2.size(); i++) {
if (!Objects.equals(values1.get(i), values2.get(i))) {
result.add(new AbstractMap.SimpleEntry<>(key, values1.get(i)));
}
}
}
return result;
}
/**
* 将Map列表转换为一个Map,key为map中的key,value为map中对应的value列表
* @param mapList map列表
* @return 转换后的Map
*/
private static Map<String, List<Object>> convertToMap(List<Map<String, Object>> mapList) {
Map<String, List<Object>> result = new HashMap<>();
for (Map<String, Object> map : mapList) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
result.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).add(entry.getValue());
}
}
return result;
}
}
```
使用示例:
```java
public static void main(String[] args) {
List<Map<String, Object>> mapList1 = new ArrayList<>();
mapList1.add(Map.of("name", "Alice", "age", 20));
mapList1.add(Map.of("name", "Bob", "age", 30));
List<Map<String, Object>> mapList2 = new ArrayList<>();
mapList2.add(Map.of("name", "Alice", "age", 21));
mapList2.add(Map.of("name", "Bob", "age", 30, "gender", "male"));
Set<Map.Entry<String, Object>> diff = MapDiffUtil.diff(mapList1, mapList2);
System.out.println(diff);
}
```
输出结果为:
```
[name=Bob, age=30, gender=male]
[name=Alice, age=21]
```
阅读全文