如何在移除迭代器元素时,判断条件依赖迭代器关联对象的属性?
报错根因
并发修改异常的触发原因是:在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
相关产品推荐
相关产品推荐

