掌握 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) // 自动转为String
is Int -> println(obj.plus(1)) // 自动转为Int
else -> 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 嵌套。