Kotlin 循环控制(保姆级教程)

Kotlin 循环控制:让代码跑得更聪明

在编程世界里,循环就像是一台永不停歇的发动机,让程序能够重复执行某些任务。无论是遍历数据、处理集合,还是完成重复性操作,掌握循环控制都是开发者必须掌握的核心技能。而 Kotlin 作为现代编程语言的代表,提供了丰富且优雅的循环结构,让开发者在编写逻辑时更加高效、安全和简洁。

今天我们就来深入聊聊 Kotlin 循环控制,从基础语法到高级用法,逐步带你走进这台“代码发动机”的内部工作原理。无论你是初学者还是有一定经验的开发者,相信都能从中找到实用的技巧和灵感。


for 循环:最常见也最灵活的循环方式

for 循环是 Kotlin 中最常用的循环结构,它不仅能遍历数组、列表,还能轻松处理数字范围。它的语法设计非常直观,尤其适合“我知道要执行多少次”的场景。

// 遍历一个数字范围(从 1 到 10,包含 1 和 10)
for (i in 1..10) {
    println("当前数字是:$i")
}

注释:1..10 表示一个闭区间,包含 1 和 10。in 是 Kotlin 的关键字,用于判断某个值是否在指定范围内。循环变量 i 会依次取 1 到 10 的每一个整数值。

如果你想要倒序遍历,也很简单:

// 倒序遍历:从 10 到 1
for (i in 10 downTo 1) {
    print("$i ")
}
println() // 换行

注释:downTo 关键字用于生成递减序列。print 不会自动换行,所以最后用 println() 手动换行。

再来看一个更实用的例子:遍历一个字符串中的每个字符。

val text = "Hello Kotlin"
for (char in text) {
    println("字符:$char")
}

注释:text 是一个字符串,Kotlin 支持直接对字符串使用 for 循环,循环变量 char 会逐个取出每个字符。


while 和 do-while 循环:条件驱动的循环

当循环次数不确定时,whiledo-while 就派上用场了。它们的执行依赖于一个布尔条件,只要条件为 true,循环就会继续。

while 循环:先判断,后执行

var counter = 1
while (counter <= 5) {
    println("第 $counter 次循环")
    counter++ // 每次递增 1
}

注释:while 会在每次循环开始前检查条件。如果条件为 false,循环体将不会执行。因此,如果初始条件不满足,整个循环可能一次都不执行。

do-while 循环:先执行,后判断

var num = 10
do {
    println("当前数字:$num")
    num -= 2
} while (num > 0)

注释:do-while 会先执行一次循环体,再判断条件。这意味着即使条件一开始为 false,循环体也至少执行一次。这在需要“至少执行一次”的场景中非常有用。


遍历集合:让循环更优雅

在实际开发中,我们经常需要遍历集合(如 List、Set、Map)。Kotlin 提供了简洁的语法来实现这一点。

val fruits = listOf("苹果", "香蕉", "橙子", "葡萄")

// 遍历列表,获取每个元素
for (fruit in fruits) {
    println("我喜欢吃:$fruit")
}

注释:listOf() 是 Kotlin 创建不可变列表的快捷方式。for (fruit in fruits) 会自动迭代列表中的每一个元素,变量 fruit 依次代表每个水果。

如果你还需要知道当前元素的索引,可以使用 withIndex()

val colors = listOf("红色", "绿色", "蓝色")

for ((index, color) in colors.withIndex()) {
    println("第 $index 个颜色是:$color")
}

注释:withIndex() 会将集合转换为 (索引, 元素) 的键值对。通过解构语法 val (index, color),我们能同时获取索引和值。


循环控制语句:跳出与跳过

在复杂逻辑中,我们可能需要在循环内部提前结束或跳过某次迭代。Kotlin 提供了 breakcontinue,但它们的行为与 Java 有些不同,尤其在嵌套循环中。

break:立即退出当前循环

for (i in 1..10) {
    if (i == 6) {
        break // 当 i 等于 6 时,立即退出 for 循环
    }
    println(i)
}

注释:break 会跳出当前最内层的循环。输出结果是 1 到 5。

continue:跳过本次循环,继续下一次

for (i in 1..10) {
    if (i % 2 == 0) {
        continue // 如果是偶数,跳过本次循环
    }
    println("奇数:$i")
}

注释:continue 会跳过当前循环体中剩余代码,直接进入下一次迭代。输出结果是 1、3、5、7、9。


标签与带标签的 break/continue:解决嵌套循环的难题

当你有嵌套循环时,breakcontinue 默认只作用于最内层循环。但有时我们需要跳出外层循环。Kotlin 通过“标签”机制来解决这个问题。

outerLoop@ for (i in 1..3) {
    for (j in 1..3) {
        if (i == 2 && j == 2) {
            break@outerLoop // 跳出名为 outerLoop 的外层循环
        }
        println("i = $i, j = $j")
    }
}

注释:outerLoop@ 是一个标签,给外层循环命名。break@outerLoop 表示跳出命名的循环。这在处理二维数组查找时特别有用。

同样,continue@label 也可以用于跳过外层循环的某次迭代。


实战案例:用 Kotlin 循环控制处理用户输入

假设我们要写一个程序,让用户输入数字,直到输入“quit”为止。这正是 while 循环的典型应用场景。

import kotlin.random.Random

fun main() {
    println("请输入数字,输入 'quit' 退出:")

    while (true) { // 无限循环
        print("输入:")
        val input = readLine() ?: continue // 如果输入为空,跳过本次循环

        if (input.lowercase() == "quit") {
            println("程序结束。")
            break // 退出循环
        }

        try {
            val number = input.toInt()
            val randomNum = Random.nextInt(1, 100)
            if (number == randomNum) {
                println("恭喜!你猜中了!")
            } else {
                println("很遗憾,正确答案是:$randomNum")
            }
        } catch (e: NumberFormatException) {
            println("请输入有效的数字或 'quit' 退出。")
        }
    }
}

注释:readLine() 用于读取用户输入,返回 String?,所以需要使用 ?: continue 处理空输入。try-catch 用于防止非数字输入导致程序崩溃。while (true) 实现无限循环,直到 break 才退出。


总结:让循环成为你的编程伙伴

Kotlin 循环控制不仅语法简洁,而且功能强大。从简单的 for 遍历到灵活的 while,再到带标签的高级控制,每一种方式都有其适用场景。

掌握这些技巧,不仅能让你的代码更高效,还能减少错误,提升可读性。尤其是在处理数据、用户交互或复杂逻辑时,恰当的循环控制是写出高质量代码的关键。

记住,循环不是“让代码重复”,而是“让逻辑自动执行”。当你能精准控制循环的开始、结束与跳转,你就真正掌握了 Kotlin 循环控制的精髓。

现在,不妨动手写一段代码,用 for 遍历一个列表,再用 while 实现一个简单的猜数字游戏。实践,才是掌握 Kotlin 循环控制的最佳方式。