背景
when
是 Kotlin 中功能非常强大的条件表达式,可以看作是 switch
的升级版。它有两种主要用法:带参数 和不带参数。理解这两种用法及其适用场景,有助于写出更简洁、更易读的代码。
一、带参数的 when
基本语法
Kotlin
when (variable) {
value1 -> action1()
value2 -> action2()
else -> defaultAction()
}
示例
Kotlin
// 判断具体值
when (status) {
"success" -> println("成功")
"error" -> println("错误")
"loading" -> println("加载中")
else -> println("未知状态")
}
// 判断类型
when (response) {
is Success -> handleSuccess(response)
is Error -> handleError(response)
is Loading -> showLoading()
}
// 多值匹配
when (code) {
200, 201 -> println("请求成功")
404 -> println("未找到")
500 -> println("服务器错误")
else -> println("其他状态码: $code")
}
特点
-
适合对同一个变量进行多分支判断。
-
支持类型判断与多值匹配。
-
可读性好,类似 Java 的
switch
,但更灵活。
二、不带参数的 when
基本语法
Kotlin
when {
condition1 -> action1()
condition2 -> action2()
else -> defaultAction()
}
示例
Kotlin
// 判断不同条件
when {
response == null -> handleNull()
response.isSuccess() -> handleSuccess()
else -> handleFailure()
}
// 复杂条件组合
fun shouldShowPromotion(user: User?): Boolean = when {
user == null -> false
user.isVip -> false
user.signInDays > 7 -> true
user.purchaseCount == 0 -> true
else -> false
}
// UI 显示逻辑
fun getViewVisibility(): Int = when {
isLoading -> View.GONE
data.isNullOrEmpty() -> View.GONE
hasError -> View.VISIBLE
else -> View.VISIBLE
}
特点
-
不依赖单一变量。
-
更灵活,可以混合不同条件。
-
常用于多条件判断和复杂逻辑表达。
三、对比总结
特性 | 带参数 when(x) |
不带参数 when { } |
---|---|---|
适用场景 | 判断同一变量的不同值 | 判断多个独立条件 |
可读性 | 针对单一变量更清晰 | 更灵活,但条件过多易复杂化 |
常见用例 | 状态码、枚举、类型匹配 | null 检查、UI 状态控制、业务逻辑 |
四、最佳实践
-
单一变量多分支 :优先用带参数的
when(x)
,更简洁直观。 -
多条件组合判断 :使用不带参数的
when {}
,避免嵌套if-else
。 -
覆盖所有情况 :尽量包含
else
分支,确保健壮性(除非编译器可确定已覆盖所有情况)。
总结
👉 when(x)
:用于同一个变量 的多种取值(如枚举、状态码)。
👉 when {}
:用于多个条件的判断(如逻辑组合、状态切换)。