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
下班记得打卡