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

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程世界中,循环控制如同指挥交响乐团的指挥家——它决定了代码执行的节奏与方向。无论是处理数据列表、计算复杂公式,还是构建游戏逻辑,Kotlin 循环控制都是开发者不可或缺的工具。对于编程初学者而言,掌握循环的语法与逻辑是迈向进阶的关键一步;而中级开发者则可以通过深入理解循环的优化技巧,进一步提升代码的效率与可维护性。本文将从基础概念出发,结合实际案例,逐步解析 Kotlin 中的循环控制机制,并提供实用技巧,帮助读者构建扎实的循环编程思维。


基础循环结构:理解循环的“骨骼”

1. for 循环:有序重复的“指挥棒”

for 循环是 Kotlin 中最常用且灵活的循环结构,适用于已知循环次数或需要遍历集合的场景。其核心语法如下:

for (变量 in 可迭代对象) {
    // 循环体
}

示例 1:遍历数字列表

val numbers = listOf(1, 2, 3, 4, 5)
for (num in numbers) {
    println("当前数字:$num")
}
// 输出:当前数字:1 到 当前数字:5

示例 2:范围循环
Kotlin 的 in 关键字支持直接定义数字范围,例如:

for (i in 1..5) {  // 包含 5
    print("$i ")
}
// 输出:1 2 3 4 5

若需排除终点,可以使用 until

for (i in 1 until 5) {  // 不包含 5
    print("$i ")
}
// 输出:1 2 3 4

比喻for 循环如同在图书馆的书架上逐本翻阅书籍,每本书(元素)都会被访问一次,直到遍历完整个书架(集合)。


2. while 循环:条件驱动的“守门人”

当循环次数不确定时,while 循环通过判断条件来决定是否继续执行。其语法为:

while (条件表达式) {
    // 循环体
}

示例:计算阶乘

var result = 1
var n = 5
while (n > 0) {
    result *= n
    n--
}
println("5! = $result")  // 输出:120

注意while 的条件判断在循环体执行前进行,若初始条件不满足,循环体可能一次都不会执行。


3. do-while 循环:先执行后判断的“冒险家”

while 不同,do-while 的循环体至少执行一次,即使条件不满足:

do {
    // 循环体
} while (条件表达式)

示例:猜数字游戏

var secretNumber = 42
var guess = 0
do {
    println("请输入猜测的数字:")
    guess = readLine()?.toInt() ?: 0
    if (guess < secretNumber) println("太小了!")
    else if (guess > secretNumber) println("太大了!")
} while (guess != secretNumber)
// 无论初始输入如何,循环至少运行一次

比喻do-while 像是先试吃一口蛋糕再决定是否继续,而 while 则是先看蛋糕是否符合口味再决定是否尝试。


进阶技巧:让循环更灵活高效

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

Kotlin 提供 breakcontinue 关键字,用于调整循环流程:

  • break:立即终止当前循环。
  • continue:跳过本次循环的剩余代码,直接进入下一轮。

示例:查找第一个偶数

val numbers = listOf(3, 7, 11, 2, 9)
for (num in numbers) {
    if (num % 2 == 0) {
        println("找到第一个偶数:$num")
        break  // 跳出循环
    }
}

示例:跳过负数

for (num in listOf(-1, 2, -3, 4)) {
    if (num < 0) continue
    println("正数:$num")
}
// 输出:正数:2 和 正数:4

2. 迭代器与范围扩展:掌控循环的“细枝末节”

Kotlin 的迭代器(iterator())允许手动控制遍历过程,而范围扩展(downTo, step)则提供了更灵活的数字范围定义:

示例:反向遍历

for (i in 5 downTo 1) {  // 从5倒序到1
    print("$i ")
}
// 输出:5 4 3 2 1

示例:步长控制

for (i in 1..10 step 2) {  // 步长为2
    print("$i ")
}
// 输出:1 3 5 7 9

3. 嵌套循环:构建多维逻辑

多个循环的嵌套可以处理复杂的数据结构,如二维数组或表格:

示例:打印乘法表

for (i in 1..9) {
    for (j in 1..9) {
        print("$i×$j=${i*j}\t")
    }
    println()
}

实际案例:用循环解决真实问题

案例 1:斐波那契数列生成

斐波那契数列的前两项为 0 和 1,后续项为前两项之和。使用 while 循环实现:

fun generateFibonacci(n: Int): List<Int> {
    val list = mutableListOf(0, 1)
    while (list.size < n) {
        val next = list[list.size - 1] + list[list.size - 2]
        list.add(next)
    }
    return list
}
println(generateFibonacci(10))  // 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

案例 2:文件逐行处理

假设需统计文本文件中的单词数量,可结合 BufferedReaderwhile 循环:

val reader = File("input.txt").bufferedReader()
var wordCount = 0
var line = reader.readLine()
while (line != null) {
    wordCount += line.split(" ").size
    line = reader.readLine()
}
reader.close()
println("总单词数:$wordCount")

注意事项:避免循环的“陷阱”

1. 无限循环的防范

while 条件或 for 范围设置不当,可能导致程序无限循环。例如:

var count = 0
while (count < 5) {  // 忘记更新 count
    // ...未执行 count++
}
// 这会导致死循环

解决方案:在循环体内明确修改条件变量。


2. 变量作用域的控制

for 循环中,循环变量(如 num)的作用域仅限于循环体内。若需在循环外使用,需提前声明:

var max = 0
for (num in listOf(10, 20, 30)) {
    if (num > max) max = num
}
println("最大值:$max")  // 正确输出:30

3. 性能优化建议

  • 对于大型集合,避免在循环体内进行高开销操作(如频繁的 I/O 操作)。
  • 使用 indices 属性遍历索引时,优先用 list.indices 而非 0..list.size-1
  • 对于可变集合,若需在循环中修改元素,考虑使用迭代器的 remove() 方法。

结论

掌握 Kotlin 循环控制 是每位开发者迈向进阶的必经之路。从基础的 forwhile 循环到进阶的嵌套控制、迭代器应用,每一步都需结合实际问题反复练习。通过本文的案例与技巧,读者不仅能够理解循环的语法逻辑,更能将其灵活运用于数据处理、算法实现等场景。记住:循环如同编程世界的“重复魔法”,但唯有理解其原理与限制,才能真正掌控它的力量。

未来,随着 Kotlin 在 Android 开发、服务器端编程等领域的深入应用,对循环控制的优化与创新需求将持续增长。建议读者通过实战项目进一步巩固知识,并关注 Kotlin 社区的新特性(如协程与挂起函数),以应对更复杂的编程挑战。

最新发布