开发记录:集合list集合的foreach方法不能进行remove和add操作,会触发ConcurrentModificationException异常!

1、前提:

在对一个list集合进行遍历,对于习惯用stream流的人来说,都会习惯直接foreach进行遍历操作,但是一般都是设置每一个对象的值,判断操作这些。但是问题就是如果我想要直接操作这个集合,想要进行插入和删除集合中的某个元素,这个时候就要主要了,就会报这个错。当然,前提就是你操作的是你现在正在进行遍历的这个集合,如果是遍历一个集合,但是要进行增删操作的是另外一个集合,那就没问题

2、解决方法:

解决的方法就是如果当前遍历的集合,需要对它进行增减操作,就使用普通for循环或者迭代器,我一般是用的迭代器去替换那些操作的。

3、代码操作:

业务场景:

现在是有一个最新学生集合当前学生集合,我们当前学生集合要根据最新学生集合来进行增加或者删除的更新操作,比如现在最新的学生集合里有我们当前学生集合没有的学生(遍历新学生集合,操作当前学生集合),就说明有新的学生加入,那我们当前学生集合就要新增一个;如果现在我们当前学生集合有最新学生集合没有的学生(遍历当前学生集合,操作当前学生集合),就说明有一个学生已经被退出,那我们当前学生集合就要删除这个学生。

代码解说:


List<Student> newList = new ArrayList<>();//这里是初始化,实质你们存实际数据进去。

List<Student> oldList = new ArrayList<>();//这里是初始化,实质你们存实际数据进去。

List<String> newIds = newList.stream().map(Student::getId).collect(Collectors.toList());

List<String> oldIds = oldList.stream().map(Student::getId).collect(Collectors.toList());

//遍历原来的,看一下有没有已被删除了的学生,有就要删除:这里是遍历当前集合,当前集合操作
Iterator<Student> iterator = oldList.iterator();
while (iterator1.hasNext()) {
    Student item = iterator.next();
        if (!newIds.contains(item.getId())) {
            // 在迭代过程中添加或者删除元素
            iterator.remove();
        }
}
//遍历最新的,看一下有没有新增了的菜单,有就新增进去:这里是遍历一个集合,另外一个集合操作
newList.forEach(e -> {
    if (!oldIds.contains(e.getId())) {
          oldList.add(e);
    }
});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值