条件控制:if表达式、when表达式、when的多种用法
条件控制,说白了就是让代码学会「看情况办事」。
我刚开始写 Kotlin 时,最直观的感受就是:这语言把条件判断玩出了花。尤其是 when,它比 Java 的 switch 强太多了。今天咱们就把它彻底聊透。
1. if 表达式:不只是语句,更是表达式
在 Kotlin 里,if 是有返回值的。这意味着你可以直接用它来赋值。
// 传统写法
var max = a
if (a < b) max = b
// 表达式写法
val max = if (a > b) a else b
我个人习惯用表达式写法,代码更紧凑,也少写几行。
核心区别:Java 的 if 是语句,Kotlin 的 if 是表达式。表达式可以返回值,语句不能。
你想想看,如果 if 分支里逻辑比较复杂,还能用代码块:
val result = if (score >= 90) {
println("优秀")
"A"
} else if (score >= 80) {
println("良好")
"B"
} else {
println("继续努力")
"C"
}
代码块的最后一行就是返回值。嗯,这里要注意:if 作为表达式时,else 分支不能省略。
避坑指南:我曾经在项目里写了一个没有 else 的 if 表达式,结果编译报错。Kotlin 要求表达式必须覆盖所有分支,否则就用 Unit 兜底。
2. when 表达式:switch 的终极进化
when 是 Kotlin 条件控制的王牌。它比 Java 的 switch 灵活太多了。
基本用法:
when (x) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> println("x 不是 1 也不是 2")
}
注意,这里没有 break。Kotlin 默认只匹配一个分支,不会穿透。我当年从 Java 转过来时,第一反应是「不用写 break 了?」,试了一下,真香。
3. when 的多种用法
3.1 区间匹配
用 in 关键字判断是否在某个范围内:
val age = 25
when (age) {
in 0..12 -> println("儿童")
in 13..17 -> println("青少年")
in 18..60 -> println("成年人")
else -> println("老年人")
}
我在项目中处理过用户年龄分段,用这个写法,代码清晰得像一张表格。
3.2 类型匹配
用 is 关键字判断类型:
fun describe(obj: Any): String = when (obj) {
is Int -> "整数: $obj"
is String -> "字符串,长度 ${obj.length}"
is List<*> -> "列表,大小 ${obj.size}"
else -> "未知类型"
}
这里 Kotlin 会自动做智能类型转换。你想想看,在 Java 里你得先 instanceof,再强转,多麻烦。
个人经验:我在写网络请求的响应处理时,经常用 when + is 来区分成功、失败、异常等不同响应类型。代码可读性直接拉满。
3.3 无参数 when
当条件比较复杂时,可以省略 when 的参数:
when {
score >= 90 -> "优秀"
score >= 80 -> "良好"
score >= 60 -> "及格"
else -> "不及格"
}
这种写法本质上就是 if-else if 链的替代品。我个人觉得它比 if 链更整齐,每个条件一行,一目了然。
4. 知识体系总览
下面这张图帮你理清 Kotlin 条件控制的整体脉络:
5. 实战对比:if vs when
| 场景 | 推荐用 | 原因 |
|---|---|---|
| 二选一(true/false) | if | 语义清晰,代码简洁 |
| 多个离散值匹配 | when | 比 if-else if 链更整齐 |
| 区间判断 | when + in | 可读性极强,一目了然 |
| 类型判断 | when + is | 自动智能类型转换 |
| 复杂条件组合 | 无参数 when | 每个条件独立,便于维护 |
我的建议:能用 when 的地方尽量用 when。它比 if 链更 Kotlin 风格,也更安全。但如果是简单的二选一,if 就够了,别过度设计。
6. 避坑总结
- if 表达式必须有 else:除非你把它当语句用(不赋值)。
- when 默认不穿透:不需要 break,但如果你想合并多个分支,用逗号:
1, 2, 3 -> ... - 类型匹配时注意泛型擦除:
is List<String>在运行时无法区分,只能用is List<*>。 - 无参数 when 的性能:和 if-else if 链一样,编译器会优化成类似的字节码。
好了,条件控制这块就聊到这儿。记住一句话:if 解决二选一,when 搞定多分支。写 Kotlin 时,多用 when,你会爱上它的。