Android中移除列表元素触发java.util.ConcurrentModificationException问题求助
我来帮你搞定这个问题!你遇到的ConcurrentModificationException本质上是因为你在遍历集合的同时直接修改了原集合,再加上之前的逻辑判断也没对齐需求,才导致了问题。先拆解下你之前的尝试哪里出问题,再给你正确的实现方式:
先说说你之前三种尝试的问题
- 第一种和第二种用
map+removeIf/removeAll:map是用来转换集合元素的,不是用来做修改操作的工具!而且你在map遍历原列表的过程中直接调用list.removeIf/removeAll,相当于一边遍历一边修改原集合,这必然触发并发修改异常。更关键的是逻辑完全错了——你现在的写法是“只要变体里有一个颜色不等于过滤色就移除变体”,但你的需求是“变体完全不包含过滤色才移除”,完全搞反了判断逻辑。 - 第三种迭代器的写法:你内层遍历变体的颜色列表,只要遇到一个不等于过滤色的颜色就把整个变体删掉,这逻辑不对啊!比如一个变体有红、蓝两种颜色,过滤色是红,那你遍历到蓝的时候就把这个变体删了,这显然不符合你要保留包含过滤色变体的需求。而且这种嵌套迭代器的写法完全没必要,反而容易搞混移除的时机。
正确的实现方式(两种可选)
1. 直接修改原列表(推荐,简洁高效)
用removeIf方法,它底层是用迭代器实现的,不会触发并发修改异常,而且能精准匹配你的需求:
// 移除所有不包含过滤色的变体 list.removeIf { variant -> !variant.variantColors.contains(filterModel.color) }
解释:removeIf会遍历列表,对每个变体判断:如果它的颜色列表不包含过滤色,就把这个变体从原列表中移除,完美匹配你的需求。
2. 生成新的过滤后列表(不修改原列表)
如果不想改动原列表,可以用filter生成一个新列表,只保留包含过滤色的变体:
val filteredVariants = list.filter { variant -> variant.variantColors.contains(filterModel.color) }
这种方式更安全,尤其是当原列表还被其他代码引用的时候,不会影响到其他地方的逻辑。
核心总结
解决问题的关键有两点:
- 不要在遍历原集合的同时直接修改它(除非用
removeIf或者迭代器的remove方法,且逻辑正确); - 明确判断条件:是变体完全不包含过滤色才移除,而不是有一个颜色不匹配就移除。
内容的提问来源于stack exchange,提问作者edi233
相关产品推荐
相关产品推荐

