我自定义的函数式编程自定义接口 可替换为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自定义