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

如何在移除迭代器元素时,判断条件依赖迭代器关联对象的属性?

报错根因

并发修改异常的触发原因是:在for-each遍历列表的过程中,直接调用了列表本身的remove/removeIf方法修改列表结构。Kotlin增强for循环底层依赖迭代器实现,直接修改原列表会导致迭代器的修改计数和预期值不一致,因此抛出异常。

原有实现的嵌套循环逻辑也存在错误:外层遍历到某个preference的单个id时,要么直接全量过滤整个列表,要么直接删除当前遍历的preference,逻辑冗余且不符合预期。

推荐解法:用过滤操作生成新列表

Kotlin的不可变集合操作是最稳妥的方案,不需要修改原列表,直接按规则过滤得到符合要求的新列表即可:

// 逻辑:保留所有restaurantIDs中元素全部在listOfIds内的preference
val validPreferences = preferencesWithRestaurant.filter { preference ->
    preference.restaurantIDs.all { restaurantId ->
        restaurantId in listOfIds
    }
}

后续直接使用validPreferences即可。

可选解法:用迭代器修改原可变列表

如果必须在原列表上做修改,可以使用迭代器自带的remove方法,不会触发并发修改异常:

val iterator = preferencesWithRestaurant.iterator()
while (iterator.hasNext()) {
    val currentPref = iterator.next()
    // 只要currentPref的restaurantIDs存在不在listOfIds内的元素,就删除该对象
    if (currentPref.restaurantIDs.any { it !in listOfIds }) {
        iterator.remove()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:05