Appearance
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 的登场时刻!
它让代码像乐高积木一样——模块化、可组装、易维护!
(附思维导图总结核心知识点)