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

Java与Kotlin for循环对比:迭代修改列表大小的Kotlin替代方案

在Kotlin迭代时修改列表大小的正确实现方式

你遇到的问题根源在于Kotlin的0 .. list.size会在循环启动前就生成一个固定的闭区间,后续列表长度变化不会更新这个区间,因此删除元素后很容易触发IndexOutOfBoundException;而Java的普通for循环每次迭代都会重新计算list.size(),所以能动态适配列表长度变化。

下面是几种可行的Kotlin替代实现:

1. 手动控制索引的while循环(最贴近Java原逻辑)

这种方式完全复刻Java的逻辑,手动管理索引,适配列表的动态变化:

var j = 0
while (j < list.size) {
    if (someCondition()) {
        list.removeAt(j)
        // 删除元素后,后续元素前移,无需递增索引
    } else {
        j++
    }
}

注意:删除元素时不要递增索引,否则会跳过被前移的下一个元素;只有当不执行删除操作时,才推进索引。

2. 反向迭代列表

从列表末尾往前遍历,删除元素不会影响未迭代的元素索引,既不会越界也不会跳过元素:

for (j in list.lastIndex downTo 0) {
    if (someCondition()) {
        list.removeAt(j)
    }
}

这种写法简洁且不易出错,是修改原列表时的推荐方案之一。

3. 函数式过滤(创建新列表)

如果业务允许创建新列表而非修改原列表,这种方式更符合Kotlin的函数式编程风格,代码更简洁安全:

// 生成过滤后的新列表
val filteredList = list.filterNot { someCondition() }

// 如果需要替换原列表(需确保list是var类型)
list = list.filterNot { someCondition() }

这种方式避免了在迭代中修改原列表的风险,减少了潜在的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:16:04