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

Kotlin中遍历Map的标准方式及迭代删除条目相关问题

Kotlin遍历Map的写法差异与遍历删除问题

不同遍历写法的本质区别

你列出的8种写法输出结果完全一致,但底层实现、简洁度和推荐度有明显区别,本质可以分成两类:

函数式forEach类写法

  • mutMap.forEach { entry -> println(entry) }:这是Kotlin标准库为Map接口专门提供的内联扩展函数,是函数式风格遍历Map的首选写法,没有额外中间对象开销,lambda还支持直接解构为(key, value)参数,代码最简洁。
  • mutMap.iterator().forEach { entry -> println(entry) }:属于冗余写法,先显式获取Map迭代器再调用Iterator的forEach扩展,比直接调用Map的forEach多了无意义的显式取迭代器步骤,没有任何收益,不推荐使用。
  • mutMap.entries.forEach { entry -> println(entry) }:先获取Map的Entry集合视图(这个视图是轻量的,不会拷贝全量数据),再调用Iterable的扩展forEach遍历,运行效果和直接调Map的forEach几乎一致,只是多了一层entries集合访问,除非你后续需要单独操作entries集合,否则没必要这么写。
  • mutMap.entries.iterator().forEach { entry -> println(entry) }:冗余写法,依次取entries集合、取集合迭代器、再调迭代器的forEach,步骤更多,简洁性和性能都没有优势,不推荐。

for循环类写法

  • for (entry in mutMap) { println(entry) }:这是命令式风格遍历Map的标准写法,编译器会自动生成迭代器遍历逻辑,和Java的for-each循环实现逻辑一致,没有额外开销,如果你需要在循环里做break、continue等流程控制,这是首选写法。
  • for (entry in mutMap.entries) { println(entry) }:本质是遍历entries集合,编译器自动调用entries集合的迭代器,运行效果和直接遍历Map几乎一致,同样是多了一层entries访问,没有特殊需求不需要这么写。
  • for (entry in mutMap.iterator()) { println(entry) }:冗余写法,显式传入Map迭代器给for循环,和直接遍历mutMap生成的字节码几乎完全一致,不需要额外写iterator()调用。
  • for (entry in mutMap.entries.iterator()) { println(entry) }:冗余写法,显式取entries的迭代器再走for循环,多了无意义的步骤,不推荐。

补充说明:所有写法的遍历顺序完全一致,由你使用的Map具体实现决定——比如mutableMapOf默认返回的LinkedHashMap会按插入顺序遍历,HashMap则不保证固定遍历顺序。日常开发只需要记住两个首选写法即可:函数式场景用map.forEach,需要流程控制的命令式场景用for (entry in map),其余写法都属于冗余实现。

遍历过程中删除条目的生效规则

不是所有写法都不能正常删除,核心规则和Java的Map迭代逻辑一致:只有调用当前遍历所用迭代器自带的remove()方法,才能安全删除条目,直接调用Map自身的remove方法会触发fail-fast机制,抛出ConcurrentModificationException。
对应你列出的8种写法,具体表现如下:

  • 前4种forEach类写法:所有forEach扩展的lambda里都没有暴露迭代器实例,你只能调用Map自身的remove方法,全部都会抛出并发修改异常,无法正常删除。
  • for (entry in mutMap)、for (entry in mutMap.entries)这两种写法:迭代器是编译器隐式生成的,循环体里拿不到迭代器实例,直接调用Map.remove()同样会抛异常,无法安全删除。
  • for (entry in mutMap.iterator())、for (entry in mutMap.entries.iterator())这两种写法:如果在循环体里直接调用Map.remove(),一样会抛异常;但如果你提前把迭代器存为局部变量,在循环里调用迭代器的remove()方法,就可以安全删除当前条目,这是传统遍历删除的标准实现:
val iter = mutMap.iterator()
for (entry in iter) {
    if (entry.value < 3) {
        iter.remove() // 调用迭代器自身的remove,安全生效
    }
}

如果是Kotlin 1.4及以上版本,不需要手写迭代器,直接调用mutMap.entries.removeIf { 过滤条件 }就可以安全完成遍历删除,是更简洁的标准写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:45:48