Kotlin中遍历map集合

60 阅读3分钟

Kotlin 中遍历 Map 集合的几种常用方法:

Map 是一种键值对(Key-Value Pair)的集合,因此遍历的核心就是如何获取这些键和值。

假设我们有一个如下所示的 Map

val map = mapOf(
    "Apple" to 10,
    "Banana" to 20,
    "Cherry" to 15
)

方法一:遍历键值对(最常用)

这是最直接、最常用的方式,可以一次性获取到每一个键(key)和值(value)。

使用 for 循环和 entry

Map 集合中的每一个元素都是一个 Map.Entry 对象,它包含了 key 和 value 两个属性。

fun main() {
    val map = mapOf("Apple" to 10, "Banana" to 20, "Cherry" to 15)

    println("--- 遍历键值对 (Map.Entry) ---")
    for (entry in map) {
        println("商品: ${entry.key}, 价格: ${entry.value}")
    }
}

输出:

--- 遍历键值对 (Map.Entry) ---
商品: Apple, 价格: 10
商品: Banana, 价格: 20
商品: Cherry, 价格: 15

方法二:使用 forEach 函数(推荐的函数式风格)

Kotlin 推荐使用函数式编程风格,forEach 扩展函数让遍历变得非常简洁。

fun main() {
    val map = mapOf("Apple" to 10, "Banana" to 20, "Cherry" to 15)

    println("\n--- 使用 forEach 函数 ---")
    map.forEach { entry ->
        println("商品: ${entry.key}, 价格: ${entry.value}")
    }

    // 更简洁的写法,可以使用解构声明
    println("\n--- forEach 结合解构声明 ---")
    map.forEach { (key, value) ->
        println("商品: $key, 价格: $value")
    }
}

输出:

--- 使用 forEach 函数 ---
商品: Apple, 价格: 10
商品: Banana, 价格: 20
商品: Cherry, 价格: 15

--- forEach 结合解构声明 ---
商品: Apple, 价格: 10
商品: Banana, 价格: 20
商品: Cherry, 价格: 15

说明:  (key, value) -> ... 是一种解构声明,它能非常方便地将 Map.Entry 对象直接拆分为 key 和 value 两个变量。

方法三:只遍历键(Key)

如果你只关心 Map 中的键,可以使用 map.keys 属性,它会返回一个包含所有键的集合。

fun main() {
    val map = mapOf("Apple" to 10, "Banana" to 20, "Cherry" to 15)

    println("\n--- 只遍历键 (Key) ---")
    for (key in map.keys) {
        println("键: $key")
    }
    
    // 或者使用 forEach
    println("\n--- 使用 forEach 遍历键 ---")
    map.keys.forEach { key ->
        println("键: $key")
    }
}

输出:

--- 只遍历键 (Key) ---
键: Apple
键: Banana
键: Cherry

--- 使用 forEach 遍历键 ---
键: Apple
键: Banana
键: Cherry

方法四:只遍历值(Value)

类似地,如果你只需要值,可以使用 map.values 属性。

fun main() {
    val map = mapOf("Apple" to 10, "Banana" to 20, "Cherry" to 15)

    println("\n--- 只遍历值 (Value) ---")
    for (value in map.values) {
        println("值: $value")
    }

    // 或者使用 forEach
    println("\n--- 使用 forEach 遍历值 ---")
    map.values.forEach { value ->
        println("值: $value")
    }
}

输出:

--- 只遍历值 (Value) ---
值: 10
值: 20
值: 15

--- 使用 forEach 遍历值 ---
值: 10
值: 20
值: 15

总结与推荐

方法优点缺点推荐场景
遍历 entry信息最完整,能同时获得 key 和 value语法稍显冗长当你需要在循环中同时使用键和值时(最常见场景)。
forEach 函数代码最简洁、优雅,符合 Kotlin 风格对于非常复杂的循环逻辑,可读性可能不如传统 for 循环强烈推荐,适用于绝大多数遍历场景。
遍历 keys语义清晰,明确表示只关心键只能获取键,如果需要值还得通过 map[key] 获取,效率稍低当你确实只需要处理键的集合时。
遍历 values语义清晰,明确表示只关心值只能获取值,无法获取对应的键当你只需要处理值的集合时,例如求和、筛选等。

在日常开发中,我最常使用的是 map.forEach { (key, value) -> ... } 的形式,因为它兼顾了简洁性和信息量。