You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这种方式更安全,尤其是当原列表还被其他代码引用的时候,不会影响到其他地方的逻辑。

核心总结

解决问题的关键有两点:

  1. 不要在遍历原集合的同时直接修改它(除非用removeIf或者迭代器的remove方法,且逻辑正确);
  2. 明确判断条件:是变体完全不包含过滤色才移除,而不是有一个颜色不匹配就移除。

内容的提问来源于stack exchange,提问作者edi233

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:00:30