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自定义