1. 概述

在 Kotlin 中,遍历 Map 是一个常见操作。本文将介绍几种常用的遍历方式,包括使用 for 循环、forEach、以及通过 keysvalues 属性进行遍历。我们还会提到一些性能注意事项,帮助你在不同场景下选择最合适的方法。

2. 使用 for 循环遍历 Map

最标准的遍历方式是通过 for 循环遍历 Map 的 Entry 对象:

val map = mapOf("Key1" to "Value1", "Key2" to "Value2", "Key3" to "Value3")
for (entry in map.entries) {
    println("${entry.key} : ${entry.value}")
}

这里的 in 操作符会自动调用 map.entries 的迭代器,等价于:

for (entry in map.entries.iterator()) {
    println("${entry.key} : ${entry.value}")
}

优点:清晰直观,适合所有 Map 类型。
缺点:语法略显冗长。

3. 使用 forEach 遍历

Kotlin 提供了简洁的 forEach 扩展函数,可以简化代码:

map.forEach { entry ->
    println("${entry.key} : ${entry.value}")
}

更进一步,我们可以使用 解构声明(destructuring) 来直接获取 key 和 value:

map.forEach { (key, value) ->
    println("$key : $value")
}

⚠️ 注意:解构声明只适用于支持 component1()component2() 方法的对象,Map.Entry 正好符合这个条件。

优点:代码简洁,语义清晰。
推荐方式:大多数情况下优先使用这种方式。

4. 只遍历 Key

如果你只需要遍历所有的 key,可以使用 map.keys

for (key in map.keys) {
    println(key)
}

map.keys 返回的是一个 Set,所以你也可以这样写:

map.keys.forEach { key ->
    val value = map[key]
    println("$key : $value")
}

⚠️ 性能提醒:这种写法会多次调用 map.get(),效率不如直接遍历 Entry。

适用场景:只关心 key 的情况,或者需要根据 key 做额外处理。

5. 只遍历 Value

如果只需要遍历所有的 value,可以使用 map.values

for (value in map.values) {
    println(value)
}

同样,也可以使用 forEach

map.values.forEach { value ->
    println(value)
}

适用场景:只关心 value,无需访问 key。

6. 总结

方法 是否推荐 说明
for (entry in map.entries) ✅ 是 通用性强,性能好
map.forEach { (k, v) -> } ✅ 是 推荐方式,简洁清晰
map.keys.forEach ⚠️ 否 性能略差,适合只处理 key 的场景
map.values.forEach ⚠️ 否 同上,适合只处理 value 的场景

建议:除非你有特殊需求,否则推荐使用 forEach 配合解构声明来遍历 Map。

完整示例代码请参考:GitHub 示例地址


原始标题:Iterate Over a Map in Kotlin