Kotlin When 表达式 #
一、when 基础 #
1.1 基本语法 #
kotlin
val day = 3
when (day) {
1 -> println("星期一")
2 -> println("星期二")
3 -> println("星期三")
4 -> println("星期四")
5 -> println("星期五")
6 -> println("星期六")
7 -> println("星期日")
else -> println("无效的日期")
}
1.2 作为表达式 #
when 可以作为表达式返回值:
kotlin
val day = 3
val dayName = when (day) {
1 -> "星期一"
2 -> "星期二"
3 -> "星期三"
4 -> "星期四"
5 -> "星期五"
6 -> "星期六"
7 -> "星期日"
else -> "无效的日期"
}
println(dayName) // 星期三
1.3 多条件合并 #
kotlin
val day = 6
val type = when (day) {
1, 2, 3, 4, 5 -> "工作日"
6, 7 -> "周末"
else -> "无效日期"
}
println(type) // 周末
二、范围匹配 #
2.1 数值范围 #
kotlin
val score = 85
val grade = when (score) {
in 90..100 -> "优秀"
in 80 until 90 -> "良好"
in 70 until 80 -> "中等"
in 60 until 70 -> "及格"
in 0 until 60 -> "不及格"
else -> "无效分数"
}
println(grade) // 良好
2.2 字符范围 #
kotlin
val char = 'M'
when (char) {
in 'A'..'Z' -> println("大写字母")
in 'a'..'z' -> println("小写字母")
in '0'..'9' -> println("数字")
else -> println("其他字符")
}
2.3 集合包含 #
kotlin
val num = 5
when (num) {
in listOf(1, 3, 5, 7, 9) -> println("奇数")
in setOf(2, 4, 6, 8, 10) -> println("偶数")
else -> println("其他")
}
三、类型匹配 #
3.1 基本类型匹配 #
kotlin
val obj: Any = "Hello"
when (obj) {
is String -> println("字符串: ${obj.length}")
is Int -> println("整数: $obj")
is Double -> println("浮点数: $obj")
is Boolean -> println("布尔值: $obj")
else -> println("未知类型")
}
3.2 智能类型转换 #
kotlin
val obj: Any = "Kotlin"
val result = when (obj) {
is String -> obj.uppercase() // 自动转换为 String
is Int -> obj * 2 // 自动转换为 Int
else -> obj.toString()
}
3.3 复杂类型匹配 #
kotlin
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
fun handle(result: Result) = when (result) {
is Success -> println("成功: ${result.data}")
is Error -> println("错误: ${result.message}")
Loading -> println("加载中...")
}
四、条件表达式 #
4.1 无参数 when #
kotlin
val score = 85
val grade = when {
score >= 90 -> "优秀"
score >= 80 -> "良好"
score >= 70 -> "中等"
score >= 60 -> "及格"
else -> "不及格"
}
4.2 复杂条件 #
kotlin
val a = 10
val b = 20
when {
a > b -> println("a > b")
a < b -> println("a < b")
else -> println("a == b")
}
4.3 多变量条件 #
kotlin
val x = 10
val y = 20
when {
x > 0 && y > 0 -> println("第一象限")
x < 0 && y > 0 -> println("第二象限")
x < 0 && y < 0 -> println("第三象限")
x > 0 && y < 0 -> println("第四象限")
else -> println("坐标轴上")
}
五、代码块分支 #
5.1 多行代码 #
kotlin
val score = 85
when (score) {
in 90..100 -> {
println("恭喜!")
println("成绩优秀")
}
in 80 until 90 -> {
println("继续努力!")
println("成绩良好")
}
else -> {
println("需要加油!")
}
}
5.2 返回值 #
kotlin
val score = 85
val result = when (score) {
in 90..100 -> {
val bonus = 10
"优秀 + $bonus 分奖励"
}
in 80 until 90 -> {
val bonus = 5
"良好 + $bonus 分奖励"
}
else -> "继续努力"
}
六、高级用法 #
6.1 捕获匹配值 #
kotlin
val input = "123"
when (val num = input.toIntOrNull()) {
null -> println("不是有效数字")
in 0..100 -> println("有效数字: $num")
else -> println("超出范围: $num")
}
6.2 枚举匹配 #
kotlin
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun move(direction: Direction) = when (direction) {
Direction.NORTH -> "向北移动"
Direction.SOUTH -> "向南移动"
Direction.EAST -> "向东移动"
Direction.WEST -> "向西移动"
}
6.3 密封类匹配 #
kotlin
sealed class UIState {
object Loading : UIState()
data class Success(val data: String) : UIState()
data class Error(val message: String) : UIState()
}
fun render(state: UIState) = when (state) {
UIState.Loading -> "加载中..."
is UIState.Success -> "数据: ${state.data}"
is UIState.Error -> "错误: ${state.message}"
}
6.4 解构匹配 #
kotlin
data class Point(val x: Int, val y: Int)
val point = Point(10, 20)
when (point) {
Point(0, 0) -> println("原点")
Point(0, _) -> println("在 Y 轴上") // 部分匹配
Point(_, 0) -> println("在 X 轴上")
else -> println("其他位置")
}
七、when vs if-else #
7.1 使用 when 的场景 #
kotlin
// 多分支条件
val grade = when (score) {
in 90..100 -> "A"
in 80 until 90 -> "B"
in 70 until 80 -> "C"
in 60 until 70 -> "D"
else -> "F"
}
// 类型匹配
when (obj) {
is String -> { }
is Int -> { }
is Boolean -> { }
}
7.2 使用 if-else 的场景 #
kotlin
// 简单二选一
val max = if (a > b) a else b
// 复杂逻辑条件
if (user.isLoggedIn && user.hasPermission) {
// ...
}
八、实战示例 #
8.1 计算器 #
kotlin
fun calculate(a: Double, b: Double, operator: Char): Double {
return when (operator) {
'+' -> a + b
'-' -> a - b
'*' -> a * b
'/' -> if (b != 0.0) a / b else Double.NaN
else -> throw IllegalArgumentException("无效操作符")
}
}
8.2 HTTP 状态处理 #
kotlin
fun handleResponse(statusCode: Int): String {
return when (statusCode) {
in 200..299 -> "成功"
in 300..399 -> "重定向"
in 400..499 -> "客户端错误"
in 500..599 -> "服务器错误"
else -> "未知状态"
}
}
8.3 颜色解析 #
kotlin
fun parseColor(color: String): RGB? {
return when (color.lowercase()) {
"red" -> RGB(255, 0, 0)
"green" -> RGB(0, 255, 0)
"blue" -> RGB(0, 0, 255)
"white" -> RGB(255, 255, 255)
"black" -> RGB(0, 0, 0)
else -> null
}
}
data class RGB(val r: Int, val g: Int, val b: Int)
8.4 命令解析 #
kotlin
fun executeCommand(input: String) {
val parts = input.split(" ")
val command = parts[0]
val args = parts.drop(1)
when (command) {
"help" -> showHelp()
"list" -> listItems()
"add" -> if (args.isNotEmpty()) addItem(args[0])
"remove" -> if (args.isNotEmpty()) removeItem(args[0])
"exit" -> exit()
else -> println("未知命令: $command")
}
}
九、最佳实践 #
9.1 使用 else 分支 #
kotlin
// 推荐:处理所有情况
when (value) {
// ...
else -> handleDefault()
}
// 密封类可以省略 else(编译器检查)
sealed class State
when (state) {
// 编译器会提示是否覆盖所有情况
}
9.2 提取复杂条件 #
kotlin
// 不推荐
when {
user.age >= 18 && user.hasLicense && !user.isSuspended -> { }
// ...
}
// 推荐
val canDrive = user.age >= 18 && user.hasLicense && !user.isSuspended
when {
canDrive -> { }
// ...
}
9.3 使用 when 表达式 #
kotlin
// 推荐:使用表达式形式
val result = when (x) {
1 -> "一"
2 -> "二"
else -> "其他"
}
// 不推荐:使用语句形式
var result = ""
when (x) {
1 -> result = "一"
2 -> result = "二"
else -> result = "其他"
}
十、总结 #
when 表达式要点:
| 特性 | 说明 |
|---|---|
| 值匹配 | 1 -> "一" |
| 多值匹配 | 1, 2, 3 -> "小数字" |
| 范围匹配 | in 1..10 -> "一位数或两位数" |
| 类型匹配 | is String -> "字符串" |
| 条件匹配 | x > 0 -> "正数" |
| 捕获值 | when (val x = getValue()) |
下一步,让我们学习 循环语句!
最后更新:2026-03-27