利用List函数式接口比较集合
十二月 08, 2022
结果集合封装类
/ **
*
* 比较结果集合封装类
* /
public class CompareListSameResponseModel {
/**
* 新增数组,入参
* /
private List addList;
/**
* 修改数组,入参
* /
private List updateList;
/**
* 删除数组,数据库
* /
private List deleteList;
}
比较工具类方法
/**
* 获取新增列表、更新列表、删除列表
* 数据库未存在uniqueKey,新增数据有uniqueKey,则为新增数据
* 数据库未存在uniqueKey,新增数据也没有uniqueKey,无操作
* 数据库存在uniqueKey,新增数据有uniqueKey,则为修改数据
* 数据库存在uniqueKey,新增数据没有uniqueKey,则为删除数据
*
* @param uniqueKey 根据uniqueKey是否存在于数据库中来进行比较
* @return
* /
public static CompareListSameResponseModel getChangeListByUniqueKey(List requestList, List dbList, Function uniqueKey) {
CompareListSameResponseModel responseModel = new CompareListSameResponseModel<>();
List insertList;
List updateList;
List deleteList;
//list 为空处理
requestList = Optional.ofNullable(requestList).orElse(new ArrayList<>());
dbList = Optional.ofNullable(dbList).orElse(new ArrayList<>());
Set requestKeySet = requestList .stream() .map(uniqueKey) .collect(Collectors.toSet()); Set dbKeySet = dbList
.stream()
.map(uniqueKey)
.collect(Collectors.toSet());
//新增,从request数据中,去除db中已存在的数据
insertList = requestList
.stream()
.filter(x -> !dbKeySet.contains(uniqueKey.apply(x)))
.collect(Collectors.toList());
//修改,找出request数据,与db都有的相同的数据
updateList = requestList
.stream()
.filter(x -> requestKeySet.contains(uniqueKey.apply(x)) && dbKeySet.contains(uniqueKey.apply(x)))
.collect(Collectors.toList());// 删除,从dblist中找出,request没有的数据
deleteList = dbList
.stream()
.filter(x -> !requestKeySet.contains(uniqueKey.apply(x)))
.collect(Collectors.toList());
responseModel.setAddList(insertList);
responseModel.setUpdateList(updateList);
responseModel.setDeleteList(deleteList);
return responseModel;
}
上面方式用于比较对象泛型一致的情况,但开发的过程中一般是 请求集合 List 和数据库集合List 进行比对,使用方法是需要先将 List 转成 List 后再去使用工具进行比较得到增删改。此时满足大部分情况,但这种先转换的方式带来问题,那就是转换之后得的增删改对象都是 DbModel,原来requestModel里的属性 DbModel中没有就会存在后续代码 増删改集合中就无法使用到 requestModel中的一些属性
优化上面的代码方案
可以将泛型定义成两个 CompareListSameResponseModel<T,V> ,入参传入两个Function即可