一、实体类
1️⃣源实体类
@Data
public class SouEntity {
private String id;
private String name;
private String deptId;
}
2️⃣目标实体类
@Data
public class TarEntity {
private String id;
private String name;
private String deptId;
}
二、比较方法
1️⃣利用map
private static List<TarEntity> compareFir(List<SouEntity> souList, List<TarEntity> tarList) {
Map<String, String> map = new HashMap<>(souList.size());
for (SouEntity sou : souList) {
map.put(sou.getId(), sou.getDeptId());
}
List<TarEntity> differentList = Lists.newArrayList();
for (TarEntity tar : tarList) {
String id = tar.getId();
String deptId = tar.getDeptId();
if (map.get(id) == null || !deptId.equals(map.get(id))) {
differentList.add(tar);
}
}
return differentList;
}
2️⃣利用set的不可重复特性
private static Tuple2<List<TarEntity>, List<TarEntity>> compareSec(List<SouEntity> souList, List<TarEntity> tarList) {
List<TarEntity> existsList = Lists.newArrayList();
List<TarEntity> unExistsList = Lists.newArrayList();
Set<String> setKeys = new HashSet<String>();
for (SouEntity sou : souList) {
String join = join(sou.getId(), sou.getDeptId());
setKeys.add(join);
}
for (TarEntity tar : tarList) {
String join = join(tar.getId(), tar.getDeptId());
if (setKeys.contains(join)) {
existsList.add(tar);
} else {
unExistsList.add(tar);
}
}
return assemble(existsList, unExistsList);
}
public static String join(String... str) {
for (int i = 0; i < str.length; i++) {
str[i] = StringUtils.defaultString(str[i]);
}
return StringUtils.join(str, "#");
}
public static <T1, T2> Tuple2<T1, T2> assemble(T1 v1, T2 v2) {
return new Tuple2<T1, T2>(v1, v2);
}
public class Tuple2<T1, T2> {
private final T1 v1;
private final T2 v2;
public T1 v1() {
return v1;
}
public T2 v2() {
return v2;
}
public Tuple2(T1 v1, T2 v2) {
this.v1 = v1;
this.v2 = v2;
}
}
三、测试
public static void main(String[] args) {
List<SouEntity> souList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
SouEntity sou = new SouEntity();
sou.setId(String.valueOf(i));
sou.setName(String.valueOf(i));
sou.setDeptId(String.valueOf(i));
souList.add(sou);
}
List<TarEntity> tarList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
TarEntity tar = new TarEntity();
tar.setId(String.valueOf(i));
tar.setName(String.valueOf(i));
tar.setDeptId(String.valueOf(i));
tarList.add(tar);
}
List<TarEntity> tarEntities = compareFir(souList, tarList);
System.out.println(tarEntities);
Tuple2<List<TarEntity>, List<TarEntity>> listTuple2 = compareSec(souList, tarList);
System.out.println(listTuple2.v1());
System.out.println(listTuple2.v2());
}
结果如下:
[]
[TarEntity(id=0, name=0, deptId=0), TarEntity(id=1, name=1, deptId=1), TarEntity(id=2, name=2, deptId=2), TarEntity(id=3, name=3, deptId=3), TarEntity(id=4, name=4, deptId=4), TarEntity(id=5, name=5, deptId=5), TarEntity(id=6, name=6, deptId=6), TarEntity(id=7, name=7, deptId=7), TarEntity(id=8, name=8, deptId=8), TarEntity(id=9, name=9, deptId=9)]
[]
四、总结
利用 map 需要考虑 key 值的唯一性,如果 key 有重复,则不适合,建议采用第二种方法。