Published 2025-07-08

Kotlin 控制流

Kotlin 的控制流,如何实现条件判断、循环等控制流。

if 表达式

if 是最常用的条件判断语句。Kotlin 的 if 不仅可以像 Java/C 语言那样作为语句使用,还可以作为表达式直接赋值给变量,这让代码更加简洁。

  • 适用场景:需要根据条件执行不同分支,或根据条件为变量赋值。
  • 与 Java 区别:Kotlin 的 if 是表达式,有返回值;Java 的 if 只能作为语句。
  • 建议:分支较多时建议用 when,if 适合简单判断。
val max = if (a > b) a else b

if 还可以有多个分支:

val max = if (a > b) {
    println("a 大于 b")
    a
} else if (a == b) {
    println("a 等于 b")
    a
} else {
    println("a 小于 b")
    b
}

when 表达式

when 是 Kotlin 中功能强大的多分支选择结构,类似于 Java 的 switch,但更灵活:

  • 支持任意类型的匹配,不仅限于常量,还可以是区间、类型、表达式等。
  • 可以作为表达式,直接返回值赋给变量。
  • 支持多个条件合并,如 0, 1 -> ...
  • 适用场景:需要根据变量的多种可能值执行不同逻辑,或根据类型、区间等复杂条件分支。
  • 与 Java 区别:Java 的 switch 只能匹配常量,Kotlin 的 when 更灵活。
  • 建议:复杂分支优先用 when,代码更清晰。

匹配区间

val score = 85
when (score) {
    in 90..100 -> println("优秀")
    in 60..89 -> println("及格")
    else -> println("不及格")
}

匹配类型

fun checkType(obj: Any) {
    when (obj) {
        is String -> println("字符串长度: ${obj.length}")
        is Int -> println("整数: $obj")
        else -> println("未知类型")
    }
}

匹配多个条件

val x = 1
when (x) {
    0, 1 -> println("x 是 0 或 1")
    else -> println("x 不是 0 也不是 1")
}

when 作为表达式

val desc = when (x) {
    1 -> "one"
    2 -> "two"
    else -> "other"
}

for 循环

for 循环用于遍历区间、数组、集合等。Kotlin 的 for 循环语法简洁,支持多种遍历方式:

  • 遍历区间for (i in 1..5),可指定步长、递减等。
  • 遍历集合for (item in items),直接获取元素。
  • 遍历索引和值for ((index, value) in items.withIndex())
  • 适用场景:需要对集合、区间等进行逐个处理时。
  • 与 Java 区别:Kotlin 没有传统的 for(;;) 语法,推荐用区间和集合遍历。
  • 建议:优先用 withIndex() 获取索引和值,代码更直观。

遍历区间

for (i in 1..5) { // 包含 5
    println(i)
}
for (i in 1 until 5) { // 不包含 5
    println(i)
}
for (i in 5 downTo 1) { // 递减
    println(i)
}
for (i in 1..10 step 2) { // 步长为2
    println(i)
}

遍历集合

val items = listOf("apple", "banana", "kiwi")
for (item in items) {
    println(item)
}

遍历索引

for (index in items.indices) {
    println("第$index 个元素是 ${items[index]}")
}
for ((index, value) in items.withIndex()) {
    println("$index: $value")
}

while 与 do-while 循环

while 和 do-while 适合在循环次数不确定、需根据条件动态判断时使用。

  • while:先判断条件再执行循环体,条件不满足时一次也不执行。
  • do-while:先执行循环体,再判断条件,至少执行一次。
  • 典型应用:如用户输入校验、等待某个条件达成等。
  • 与 Java 区别:语法基本一致。
  • 建议:循环体内要注意条件变量的变化,避免死循环。

while 示例

var y = 5
while (y > 0) {
    println(y)
    y--
}

do-while 示例

var z = 0
do {
    println(z)
    z++
} while (z < 3)

典型应用:输入校验

var input: String?
do {
    println("请输入非空内容:")
    input = readLine()
} while (input.isNullOrBlank())

break 与 continue

  • break:立即跳出当前循环,常用于提前结束循环。
  • continue:跳过本次循环,直接进入下次循环判断。
  • 带标签的 break/continue:适用于多层嵌套循环,指定跳出哪一层,提升代码可读性。
  • 适用场景:需要提前终止循环或跳过某些特殊情况时。
  • 与 Java 区别:Kotlin 的标签 break/continue 更加直观和强大。
  • 建议:多层循环时建议使用标签,避免逻辑混乱。
for (i in 1..5) {
    if (i == 3) continue // 跳过3
    if (i == 4) break    // 跳出循环
    println(i)
}
// 输出 1 2

带标签的 break/continue

适用于多层嵌套循环:

outer@for (i in 1..3) {
    for (j in 1..3) {
        if (i == 2 && j == 2) break@outer
        println("i=$i, j=$j")
    }
}

常见易错点与注意事项

  • if/when 都是表达式,可以直接赋值,减少冗余代码。
  • 区间 1..5 包含 5,1 until 5 不包含 5,注意 off-by-one 错误。
  • for (i in items.indices) 获取的是索引,不是元素本身。
  • while/do-while 循环要注意条件变量的变化,避免死循环。
  • 多层循环建议用标签 break/continue 提高可读性,避免嵌套混乱。

Comments

No Comments!