利用List函数式接口比较集合

利用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即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值