(转载 原文--https://www.lmlphp.com/user/10147/article/item/415985/)
不管是哪种方式的集合遍历方法,当我们在遍历某个集合的时候,Collection的实现并没有同步化,如果在多线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用遍历操作获得的遍历对象在多线程修改集合的时候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部 的修改并不能提供任何保证。遍历对象在被创建的时候,同时创建了一张单链的索引表,指针指向原始数据对象,只能顺序读取,不能逆向操作,而set、list等集合是动态、可变的数据结构;当原始对象改变时,索引并为改变,因此,索引指针继续移动的时候,找不到要迭代的对象就会报错。
将删除对象放在一个临时的集合中,最后执行removeAll方法移除:
List<EliminateRecordResultMo> removeList = new ArrayList<>();
data.stream().forEach(vo ->{
if(vo.getNotCount() == 0) {
// System.out.println(vo.getOrgName());
removeList.add(vo);
}
});
data.removeAll(removeList);