自学内容网 自学内容网

新旧数据比较 直接可用

我自定义的函数式编程自定义接口 可替换为java.util.function.Function
public interface RSupplier<T,V> {

    V apply(T t);
}
对比类
package xxx.utils;

import xxx.RSupplier;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

//T为实体类时需要重写hashCode和equals方法
public class NewOldComparer<T> {

private List<T> insertObjs = new ArrayList<>();

private List<T> updateObjs = new ArrayList<>();

private List<T> deleteObjs = new ArrayList<>();

public NewOldComparer(List<T> newObjs, List<T> oldObjs, RSupplier<T, Long> idSupplier) {
if (null != newObjs && !newObjs.isEmpty()) {
compareHisRecord(newObjs, oldObjs, idSupplier);
} else {
noHasNewIds(oldObjs);
}
}

public List<T> insertObjs() {
return insertObjs;
}

public List<T> updateObjs() {
return updateObjs;
}

public List<T> deleteObjs() {
return deleteObjs;
}

private void compareHisRecord(List<T> newObjects, List<T> oldObjects, RSupplier<T, Long> idSupplier) {
if (oldObjects.isEmpty()) {
this.insertObjs = newObjects;
} else {
Map<Long, T> oldObjMap = oldObjects.stream().collect(Collectors.toMap(idSupplier::apply, c -> c, (c1, c2) -> c1));
Map<Long, T> newObjMap = newObjects.stream().collect(Collectors.toMap(idSupplier::apply, c -> c, (c1, c2) -> c1));
for (T curObj : newObjects) {
Long curId = idSupplier.apply(curObj);
if (oldObjMap.get(curId) == null) {
this.insertObjs.add(curObj);
} else {
T optObj = oldObjMap.get(idSupplier.apply(curObj));
if (optObj != null && !optObj.equals(curObj)) {
this.updateObjs.add(curObj);
}
}
}
for (T curOldObj : oldObjects) {
if (newObjMap.get(idSupplier.apply(curOldObj)) == null) {
this.deleteObjs.add(curOldObj);
}
}
}
}

private void noHasNewIds(List<T> oldObjs) {
if (null != oldObjs && !oldObjs.isEmpty()) {
this.deleteObjs = oldObjs;
}
}
}
使用
//新数据
List<Value> newValueList= new ArrayList<>();
//旧数据
List<Value> oldValueList= new ArrayList<>();
//比较
NewOldComparer<Value> comparer = new NewOldComparer<>(newValueList, oldValueList, Value::getRid);
        List<Value> insertList = comparer.insertObjs();
        List<Value> deleteList = comparer.deleteObjs();
        List<Value> updateList = comparer.updateObjs();
        //后续逻辑...

具体比较哪些字段,需要在对象重写的equals和hashCode自定义


原文地址:https://blog.csdn.net/HolyLordHanChaun/article/details/135527512

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!