掌握 when 的靈活運用,告別繁瑣的 if-else 鏈
以下是 Kotlin 中 when 表達式的 12種核心用法 的全面總結,涵蓋基礎到高級場景,并附帶實用示例:
一、基礎用法
1. 替代 Java 的 switch-case
when (x) {1 -> println("一")2 -> println("二")else -> println("其他")
}
2. 多條件合并
when (x) {1, 2 -> println("一或二")in 3..5 -> println("三到五")else -> println("其他")
}
二、高級匹配
3. 類型檢查(智能轉換)
when (obj) {is String -> println(obj.length) // 自動轉為Stringis Int -> println(obj.plus(1)) // 自動轉為Intelse -> println("未知類型")
}
4. 范圍匹配
when (score) {in 90..100 -> "A"in 80 until 90 -> "B"!in 60..79 -> "不及格" else -> "C"
}
5. 函數調用作為分支條件
when {x.isOdd() -> println("奇數")x.isEven() -> println("偶數")else -> println("非整數")
}
三、特殊場景
6. 無參數形式(布爾表達式鏈)
when {network.isConnected() -> fetchData()cache.isValid() -> showCachedData()else -> showError()
}
7. 枚舉匹配
enum class Color { RED, GREEN, BLUE }when (color) {Color.RED -> println("紅色")Color.GREEN -> println("綠色")Color.BLUE -> println("藍色")
}
8. 解構聲明
when (val (x, y) = point) {(0, 0) -> println("原點")(1, 1) -> println("對角線點")else -> println("其他坐標")
}
四、返回值特性
9. 作為表達式返回結果
val result = when (input) {"yes" -> "同意""no" -> "拒絕"else -> "無效輸入"
}
10. 配合 let 處理可空變量
val message = nullableStr?.let { when (it.length) {0 -> "空字符串"in 1..10 -> "短文本"else -> "長文本"}
} ?: "變量為null"
五、實用技巧
11. 與 sealed class 配合(狀態機)
sealed class Result {data class Success(val data: String) : Result()data class Error(val msg: String) : Result()
}when (result) {is Result.Success -> showData(result.data)is Result.Error -> showError(result.msg)
}
12. 替代 if-else 鏈
// 傳統寫法
if (x == 1) {// ...
} else if (x in 2..5) {// ...
} else {// ...
}// Kotlin 優雅寫法
when (x) {1 -> { /* ... */ }in 2..5 -> { /* ... */ }else -> { /* ... */ }
}
六、注意事項
窮盡性檢查:當作為表達式時,必須包含 else 分支(枚舉或密封類除外)
執行順序:按從上到下匹配,首個滿足條件的分支執行后即退出
性能優化:編譯器會將密集的整型匹配優化為 跳轉表
掌握這些用法后,when 可以替代絕大多數條件判斷場景,使代碼更簡潔安全。建議在 Android 開發中優先使用 when 替代復雜的 if-else 嵌套。