背景:最近的一个项目遇到一个需求,就是将A表中与B表不重复数据导入B表。
开发踩坑过程(欢迎大家给出意见和建议):
前提:分别查出A、B表的两组数据---ListA、ListB 其中C是表字段对应实体。
第一种:2层for循环方式
for(int i=0;i<ListA.size();i++){
for(int j=0;j<ListB.size();j++){
if(ListA.get(i).getId.equals(ListA.get(j).getId)){
ListA.remove(i);
}
}
}
缺点:数据量大时报越界异常
第二种:迭代器方式
Iterator<C> iterator = ListA.iterator();
while(iterator.hasNext()){
C c1= iterator.next();
for(C c2 : ListB){
if(c1.getId.equals(c2.getId)){
iterator.remove();
}
}
}
}
缺点:数据量大时remove()方法异常。
第三种:java8新特性流方式
List<C> cs= ListA.stream()
.filter(v1 ->ListB.stream().noneMatch(Objects.equals(v1.getId= v2.getId)))
.collect(Collectors.toList());
缺点:性能差,非常耗时。
第四种:sql去重
select * from A where (select count(1) from B where A.id=B.id)=0;
缺点:不报错,但占用较大内存 。
第五种方式:优化第四种方式
select * from A left join B on A.id=B.id where B.id is null;