/**
* 比较基础数据list和目标list,返回目标list中没有的数据和不一致的数据
*
* @param basicList 基础数据list
* @param targetList 目标list
* @param index 主键
* @return
*/
public static Map<String, List<Map<String, Object>>> checkDiffList(List<Map<String, Object>> basicList, List<Map<String, Object>> targetList, String... index) {
Map<String, Map<String, Object>> basicMap = checkListToMap(basicList, index);
Map<String, Map<String, Object>> targetMap = checkListToMap(targetList, index);
Map<String, List<Map<String, Object>>> result = new HashMap<>();
List<Map<String, Object>> insertList = Lists.newArrayList();
List<Map<String, Object>> updateList = Lists.newArrayList();
basicMap.forEach((k, v) -> {
Map<String, Object> tblData = targetMap.get(k);
if (tblData == null) {
insertList.add(v);
} else {
if (checkDiffMap(v, tblData)) {
updateList.add(v);
}
}
});
result.put("insertList", insertList);
result.put("updateList", updateList);
return result;
}
/**
* 根据index数组返回比对数据Map
*
* @param list
* @param index
* @return
*/
private static Map<String, Map<String, Object>> checkListToMap(List<Map<String, Object>> list, String... index) {
return list.stream().collect(Collectors.toMap(e -> {
StringBuilder key = new StringBuilder();
for (String item : index) {
key.append(Optional.ofNullable(e.get(item)).orElse("")).append("_");
}
return key.toString();
}, e -> e, (k1, k2) -> k1));
}
/**
* 比对两个map 如果数据不一致 则返回true
*
* @param source 基础数据list
* @param target 目标list
* @return 是否一致
*/
public static Boolean checkDiffMap(Map<String, Object> source, Map<String, Object> target) {
source = new TreeMap<>(source);
target = new TreeMap<>(target);
String sourceStr = JsonUtils.toStr(source);
String targetStr = JsonUtils.toStr(target);
return !(StringUtils.compare(sourceStr, targetStr) == 0);
}
比对两个List
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【ArkTS】鸿蒙开发 比较两个数的大小 用户界面输入两个数并输出较大数
【HarmonyOS】 鸿蒙开发 (比较两个值大小,输出较大值)在DevEco Studio中开发,用户界面输入两个值,比较两个值大小并输出较大值。主要是练习了对TextInput属性的应用。
鸿蒙开发 TextInput属性 用户界面输入 两个值比较大小 ArkTS