结果集合封装类

/ *

 * 比较结果集合封装类
 * /

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