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);
}
});