条件控制: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 条件控制的整体脉络:

Kotlin 条件控制知识体系 条件控制 if 表达式 when 表达式 作为表达式返回值 代码块最后一行返回 else 分支不可省略 区间匹配 (in) 类型匹配 (is) 无参数 when

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,你会爱上它的。


公众号:蓝海资料掘金营,微信deep3321