java.util.ConcurrentModificationException: 异常解决

异常详细信息

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)

这个异常是在遍历 list的时候,对list进行删除操作导致的.  一般是增强for循环或者.forEach()的情况。这是因为操作的list删除元素后,元素下标会变,无法确定元素。remove是在原list上进行操作的,是操作的引用

 

改为传统的for循环遍历方式不会报错 ,但这样也不推荐,因为list.size 是变量,删除一个后list.size 会-1,业务逻辑会有问题

 

for (int i = 0; i < list.size(); i++) {
if (list.get(i).getSecond() <=0) {
list.remove(i);
}
}

解决方法: 使用filter过滤,达到删除的效果
list = list.stream().filter(item -> !(item.getSecond() <= 0)).collect(Collectors.toList());  //可以看到这样是新建的一个list,尽管我还是用之前的list接的,但是内存地址是不一样的,他是两个list
// list2 = list.stream().filter(item -> !(item.getSecond() <= 0)).collect(Collectors.toList());  这样更好理解一些
因为过滤留下的是满足这个条件的item.getSecond() <= 0,所以前边要加!

下面这行代码是两个list,groupMemberList中可能有与userList中相同id的值,这行代码的作用是过滤掉userList中与
groupMemberList有重复id的值。是一个双层for循环
List<SysUsers> filterUserList = usersList.stream().filter(v-> groupMemberList.stream().noneMatch(
                            m-> m.getId().equals(v.getId()))).collect(Collectors.toList()); //删除已加入学生

 




需要 了解源码的同学请移步:https://www.cnblogs.com/dolphin0520/p/3933551.html

 

这个文章讲的更明白了: https://www.cnblogs.com/scott1102/p/17280573.html

posted @ 2021-04-15 11:43  了悟  阅读(2829)  评论(0编辑  收藏  举报