利用List函数式接口比较集合
结果集合封装类
/ *
* 比较结果集合封装类 * /
public class CompareListSameResponseModel
{
/*** 新增数组,入参 * / private List<T> addList; /** * 修改数组,入参 * / private List<T> updateList; /** * 删除数组,数据库 * / private List<T> deleteList;
}
比较工具类方法
/**
* 获取新增列表、更新列表、删除列表 * 数据库未存在uniqueKey,新增数据有uniqueKey,则为新增数据 * 数据库未存在uniqueKey,新增数据也没有uniqueKey,无操作 * 数据库存在uniqueKey,新增数据有uniqueKey,则为修改数据 * 数据库存在uniqueKey,新增数据没有uniqueKey,则为删除数据 * * @param uniqueKey 根据uniqueKey是否存在于数据库中来进行比较 * @return * / public static <T> CompareListSameResponseModel<T> getChangeListByUniqueKey(List<T> requestList, List<T> dbList, Function<? super T, ?> uniqueKey) { CompareListSameResponseModel<T> responseModel = new CompareListSameResponseModel<>(); List<T> insertList; List<T> updateList; List<T> 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
,入参传入两个Function即可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小仓鼠!
评论