Skip to content

控制流与区间

源:Kotlin Control Flow

Kotlin 的控制流设计强调 表达式 (Expression) 优先。大多数控制结构(如 ifwhen)都有返回值,这使得代码更加紧凑且易于组合。

if 表达式

在 Kotlin 中,if 是一个表达式,它可以返回一个值。因此,Kotlin 不需要三元运算符 (condition ? a : b)。

kotlin
val max = if (a > b) a else b

块级返回值

如果 if 分支是一个代码块,那么块内的最后一个表达式就是该块的返回值。

when 表达式:强大的匹配器

when 取代了传统的 switch,但其功能远超后者。

核心特性

  • 支持任意类型:不仅是常量或枚举,可以是表达式、类型、区间。
  • 穷举性检查 (Exhaustiveness):当作为表达式使用时,编译器会强制要求覆盖所有可能的分支(通常结合 sealed classenum 使用)。
  • 无 Case 穿透:每个分支执行完后自动结束,不需要 break
kotlin
when (x) {
    1 -> print("x == 1")
    2, 3 -> print("x == 2 or 3")
    in 10..20 -> print("x is in the range")
    is String -> print("x is a String of length ${x.length}")
    else -> print("otherwise")
}
kotlin
// 替代长串 if-else if
when {
    x.isOdd() -> print("x is odd")
    y.isEven() -> print("y is even")
    else -> print("x+y is funny")
}

区间与步长 (Ranges and Progressions)

Kotlin 通过区间语法简化了数值序列的操作。

  • 闭区间1..10 (包含 1 和 10)。
  • 左闭右开1 until 10 (包含 1,不包含 10)。
  • 倒序10 downTo 1
  • 步长1..10 step 2 (1, 3, 5, 7, 9)。

底层实现

对于 IntRange 等基本类型区间,编译器会将其优化为原始的 for (int i = 0; i <= 10; i++) 循环,不会产生多余的对象开销。

循环结构

for 循环

for 循环可以遍历任何提供了迭代器 (Iterator) 的对象。

kotlin
for (item in collection) print(item)

// 带索引遍历
for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

while 与 do-while

与 Java 保持一致,但注意 Kotlin 中的变量作用域更加严格。

跳转与返回

  • return:默认从最近的封闭函数或匿名函数返回。
  • break 与 continue:支持 标签 (Labels),允许从嵌套循环中直接跳出到外层。
kotlin
loop@ for (i in 1..10) {
    for (j in 1..10) {
        if (j == 5) break@loop // 直接跳出外层循环
    }
}

Kotlin 2.0 增强型智能转换 Kotlin 2.0+

在 Kotlin 2.0 中,编译器对控制流的分析更加智能。

复杂逻辑下的 Smart Cast

以前,如果在 if 之外修改了变量,智能转换可能会失效。2.0 的 K2 编译器能够通过更深的数据流分析,在更多复杂的 when 分支和逻辑组合中保持类型的自动转换,显著减少了显式 as 的使用。

总结

  • 表达式思维:利用 ifwhen 的返回值减少临时变量。
  • when 是瑞士军刀:它比 switch 更安全且表达力更强。
  • 区间让代码更自然:避免繁琐的循环边界计算。
  • 标签跳转:在处理多层嵌套时,它是保持逻辑清晰的良药。