when 是 Kotlin 里最灵活的控制结构既能当 switch 用也能当 if-else 链用。下面梳理基本用法。带主语 vs 不带主语// 带主语分支是「匹配条件」语义等价 when (x) { 1 - ... // x 1 in 1..10 - ... // x in 1..10 is Int - ... // x is Int } // 不带主语分支是「任意 Boolean 表达式」 when { x 0 - ... // 条件为 true x 0 - ... else - ... }分支条件的所有形式形式示例语义常量值1x 1多值逗号1, 2, 3任一匹配OR范围in 1..10x in 1..10集合in listx in list反范围!in 1..10不在范围类型is Int类型匹配触发智能转换反类型!is Int类型不匹配任意布尔无主语x 0 y 0Boolean 为 truewhen (x) { 0 - 零 1, 2, 3 - 小 // 多值 in 4..10 - 中 // 范围 in setOf(100, 200) - 特殊值 // 集合 !in 11..99 - 边界外 // 反范围 is Number - 数字类型 // 类型 smart cast else - 未知 }穷尽性sealed class / enum 下编译器强制覆盖所有分支不需要 elsesealed interface UiState { data class Loading(val progress: Int) : UiState data class Success(val data: String) : UiState data class Error(val msg: String) : UiState } fun render(state: UiState) when (state) { is Loading - 加载中 ${state.progress}% // smart cast 可访问 progress is Success - state.data is Error - state.msg } // 穷尽编译通过新增子类未处理会编译报错 enum class Color { RED, GREEN, BLUE } fun name(c: Color) when (c) { Color.RED - 红 Color.GREEN - 绿 Color.BLUE - 蓝 } // 穷尽非 sealed/enum 的表达式形式必须有 else否则编译错。返回值 / 嵌套使用// 直接赋值 val result when (x) { ... } // 作为函数参数 println(when (x) { 1 - 一 else - 多 }) // 嵌套 when (a) { 1 - when (b) { 1 - a1,b1 else - a1,b!1 } else - a!1 }Compose 里的典型模式// 模式1不带主语多个状态判断你之前的代码 when { state.hasPermission - BranchA() state.shouldShowRationale - BranchB() else - BranchC() } // 模式2sealed state 穷尽渲染 when (uiState) { is Loading - LoadingScreen() is Success - ContentScreen(uiState.data) is Error - ErrorScreen(uiState.msg) }