情况说明: newDepartmentListHasMatch,newUserDepartmentList为两条泛型为UserDepartment的ArrayList,整合成一条新的ArrayList,要求UserDepartment的UserDepartmentId不可重复。要求去重后者的记录
一、Set去重
//存放整合后的集合
List<UserDepartment> newList = new ArrayList<>();
newList.addAll(newDepartmentListHasMatch);
newList.addAll(newUserDepartmentList);
//去重后者,后者数据已经存在
Set<UserDepartment> userDepartmentSet = new TreeSet<>(new Comparator<UserDepartment>() {
@Override
public int compare(UserDepartment o1, UserDepartment o2) {
return o1.getUserDepartmentId().compareTo(o2.getUserDepartmentId());
}
});
userDepartmentSet.addAll(newList);
总结:以前只是用过Set对基本数据类型的去重,对于这种新知识的了解,就很想尝试运用到自己的代码,但是这里也遇到了一个问题,最后也么找到一个好一点的方法,最后放弃了。问题就是:TreeSet筛选后的数据的顺序问题,虽然在数据的重复问题上,很完美有相比第二种方法更加优雅的解决了问题,但是作为业务代码,ID这个顺序还是很重要的,最后没有找到办法只能放弃。
二、Map去重
//存放整合后的集合
List<UserDepartment> newList = new ArrayList<>();
newList.addAll(newDepartmentListHasMatch);
Map<String,UserDepartment> map = newDepartmentListHasMatch.stream()
.collect(Collectors.toMap(UserDepartment::getUserDepartmentId,Function.identity()));
//去重后者,后者数据已经存在
for(UserDepartment userDepartment:newUserDepartmentList){
if(!map.containsKey(userDepartment.getUserDepartmentId())){
newList.add(userDepartment);
}
}
总结:运用map的键的唯一性,把前者转换成map,将userDepartmetnId作为键,之后循环后者集合,如果map包含的键已经存在则废弃,很常规的想法,感觉在实习生活里,Map的运用还是很方便,也很快捷的。这里也出现了一个问题,因为开发环境在数据库中,脏数据存在时,如果newDepartmentListHasMatch本来村存在相同的userDepartmntId的时候,就会直接报错。