今天在做项目的时候,需要对接口传来的所有数据进行剔除重复数据的处理,处理后再与自己数据库中的数据进行比对。
接口传来的数据,最开始我想到的是使用foreach循环进行处理,把传的数据放到list中,再与获取的值进行比对,相同的话进行更新或者移除元素。
if(StringUtils.isNotEmpty(insertList)){
insertList.stream().forEach(s->{
if(model.getCode().equals(s.getCode())){
//updateList.add(model);
insertList.remove(model);
}
insertList.add(model);
});
}else {
insertList.add(model);
}
本以为写的挺好,但运行时候java.util.ConcurrentModificationException异常,换了迭代器方法同样报错,分析原因:本身就是对insertList的流进行循环操作,但是又对insertList进行了添加,移除操作改变的insertList的长度而出错。
之后重新修改使用for循环进行去重
for (int i = 0; i < insertList.size(); i++) {
if (model.getCode().equals(insertList.get(i).getCode())) {
insertList.remove(i);
i--;
}
}
上面代码意思也就是对insertList中元素虽然移除后,可以进行i–,把循环标志回退一位,这样就不会出现少一次遍历而报错。分析:通过上面的代码虽然能运行成功但并不是最优解,因为本身的数据与自己数据库比对会执行一次循环,去重又会执行一次循环,会加大运算量。
Map<Model> insertMap = new HashMap();
insertMap.put("数据比对唯一标识","存入的数据")
List<Model> insertList = new ArrayList<>(insertMap.values());
可以使用map,其机制本身就是不允许放重复数据,这样就减少了一次的循环。然后再把map转换为list进行更新或插入操作就好啦!
我也是刚工作的小白,有什么更好方法欢迎评论,一起成长。