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