Skip to content

Kotlin When 表达式:告别冗长的 if-else 链条 🎯

想象一下点奶茶时的场景:店员需要根据你的选择(珍珠奶茶/水果茶/咖啡)执行不同操作。传统方式像拿着清单逐条核对,而 Kotlin 的 when 表达式就像智能点单机——只需说出需求,自动匹配最佳方案!


一、为什么需要 When?🚨

痛点场景(处理订单状态):

java
// Java 的 if-else 链(像杂乱的电线)
if (status.equals("PENDING")) { /* 处理逻辑 */ }
else if (status.equals("PAID")) { /* 处理逻辑 */ }
else if (status instanceof Integer) { /* 处理逻辑 */ }
// ...更多 else if...

Kotlin 的优雅方案

kotlin
when (status) {
    "PENDING" -> "订单待处理"  // 简单值匹配
    "PAID" -> "订单已支付"    // 清晰如菜单选项
    is Int -> "订单编号: $status" // 自动识别整数类型
    !is String -> "格式错误"  // 排除非字符串
    else -> "未知状态"       // 兜底方案
}

💡 核心优势

  • switch 强大:支持类型检查范围判断智能转换
  • if-else 简洁:减少 70% 模板代码

二、When 的双重身份 🎭

身份 1:执行语句(不返回值)

kotlin
// 像选择不同工作流程
when (user.role) {
    "ADMIN" -> { 
        println("管理员操作")
        auditService.logAction() // 执行多个操作
    }
    "USER" -> println("普通用户操作")
    else -> println("未知角色")
}

身份 2:返回表达式(像智能计算器)

kotlin
// 根据输入直接产出结果
val discount = when {
    isVIP -> 0.3          // 条件1:VIP 打7折
    amount > 100 -> 0.2   // 条件2:满100减20%
    else -> 0.1           // 默认打9折
}

三、四大实战场景 🔥

场景 1:订单状态映射(SpringBoot 控制器)

kotlin
@GetMapping("/status")
fun getStatusMessage(): String {
    return when (order.status) { 
        "PENDING" -> "处理中⏳"  // 直观的状态映射
        "PAID" -> "已支付💳"    
        "SHIPPED" -> "运输中🚚"
        else -> "状态异常⚠️"
    } // 直接返回字符串结果
}

场景 2:用户权限控制

kotlin
fun checkAccess(user: User) {
    when (user.role) {
        "ADMIN" -> accessSystem()  // 管理员开所有门
        "EDITOR" -> editContent()  // 编辑只能改内容
        "GUEST" -> viewOnly()      // 访客仅查看
        else -> rejectRequest()    // 其他角色拒绝
    }
}

场景 3:智能类型处理(自动转换类型)

kotlin
// 像万能收纳盒自动分类物品
fun process(data: Any) = when (data) {
    is String -> data.uppercase()  // 📦 自动识别字符串
    is Int -> data * 2             // 🔢 自动识别整数
    is List<*> -> data.size        // 🧮 自动识别列表
    else -> "未知类型"
}

场景 4:价格区间判断

kotlin
// 类似成绩分级逻辑
val category = when (price) {
    in 0..99 -> "经济型"     // 0-99元
    in 100..999 -> "标准型"  // 100-999元
    else -> "豪华型"         // 1000元以上
}

四、避坑指南 ⚠️

陷阱 1:条件顺序错误

kotlin
// ❌ 错误示范(范围大的在前)
when (score) {
    in 0..100 -> "普通"   // 这个匹配了所有情况!
    in 90..100 -> "优秀"  // 永远执行不到
}

// ✅ 正确写法(从具体到宽泛)
when (score) {
    in 90..100 -> "优秀"  // 先匹配精确范围
    in 60..89 -> "及格"
    else -> "不及格"
}

陷阱 2:遗漏 else 分支

kotlin
// ❌ 可能崩溃(未处理其他情况)
val msg = when (code) {
    200 -> "成功"
    404 -> "未找到"
    // 缺少 else,遇到 500 会报错!
}

// ✅ 安全写法
val msg = when (code) {
    200 -> "成功"
    404 -> "未找到"
    else -> "未知状态: $code" // 安全兜底
}

五、超实用技巧 ✨

技巧 1:多条件合并

kotlin
// 像组合套餐选择
when (day) {
    "MON", "TUE", "WED" -> "工作日" // 周一到周三
    "THU", "FRI" -> "临近周末"     // 周四周五
    "SAT", "SUN" -> "休息日"       // 周末
}

技巧 2:无参数模式

kotlin
// 根据多个变量综合判断(像智能决策树)
when {
    isRainy && hasUmbrella -> "带伞出门"
    temperature > 30 -> "穿短袖"
    isMonday -> "上班日"
    else -> "宅家"
}

六、性能真相 ⚡

好消息:Kotlin 编译器会优化 when

  • 对枚举/密封类生成高效跳转表(类似 Java switch)
  • 比 if-else 链速度更快
  • 无额外内存开销

总结:何时使用 When? 🚀

场景推荐方案
单一变量多值匹配when (变量) { ... }
复杂条件组合when { 条件1 -> ... }
类型判断 + 自动转换when (变量) { is 类型 -> ... }
范围判断when (变量) { in 范围 -> ... }

🌟 终极口诀
当你有超过 2 个 if-else 时,就是 when 的登场时刻!
它让代码像乐高积木一样——模块化、可组装、易维护!

(附思维导图总结核心知识点)