Kotlin 循环控制:从基础语法到实战技巧

发布时间:2026/10/21 0:39:11

Kotlin 循环控制:从基础语法到实战技巧 1. 引言循环是编程语言中最基础也最常用的控制结构之一。Kotlin 作为一门现代 JVM 语言在循环控制上既保留了传统语言的经典写法又引入了许多简洁、安全的语法特性。本文将从基础语法出发结合丰富的代码实例系统讲解 Kotlin 中的循环控制方式帮助读者在实际开发中写出更优雅、更高效的循环代码。2. 基础循环for、while 与 do-whileKotlin 提供了三种基本的循环结构for、while和do-while。其中for循环主要用于遍历集合或区间while和do-while则适用于条件控制的场景。2.1 for 循环Kotlin 的for循环可以遍历任何提供了迭代器的对象最常见的用法是遍历区间和数组。fun main() { // 遍历整数区间 1..5 for (i in 1..5) { println(i $i) } // 遍历数组 val fruits arrayOf(Apple, Banana, Cherry) for (fruit in fruits) { println(水果: $fruit) } // 使用索引遍历 for (index in fruits.indices) { println(索引 $index 对应的水果是 ${fruits[index]}) } // 同时获取索引和值 for ((index, fruit) in fruits.withIndex()) { println(第 $index 个水果是 $fruit) } }运行结果i 1 i 2 i 3 i 4 i 5 水果: Apple 水果: Banana 水果: Cherry 索引 0 对应的水果是 Apple 索引 1 对应的水果是 Banana 索引 2 对应的水果是 Cherry 第 0 个水果是 Apple 第 1 个水果是 Banana 第 2 个水果是 Cherry2.2 while 循环while循环在每次迭代前检查条件只有条件为真时才执行循环体。fun main() { var count 0 while (count 5) { println(count $count) count } }运行结果count 0 count 1 count 2 count 3 count 42.3 do-while 循环do-while循环与while的区别在于它先执行一次循环体再检查条件。因此无论条件是否成立循环体至少会执行一次。fun main() { var number 10 do { println(当前值: $number) number-- } while (number 7) }运行结果当前值: 10 当前值: 9 当前值: 83. 区间与步长控制Kotlin 的区间Range是循环控制的重要工具通过..、downTo、step等操作符可以灵活控制循环的范围和步长。3.1 正向区间与反向区间fun main() { // 正向区间 1..5包含两端 for (i in 1..5) { print($i ) } println() // 反向区间 5 downTo 1包含两端 for (i in 5 downTo 1) { print($i ) } println() // 左开右闭区间 until不包含结束值 for (i in 1 until 5) { print($i ) } println() }运行结果1 2 3 4 5 5 4 3 2 1 1 2 3 43.2 使用 step 控制步长fun main() { // 步长为 2输出 1 3 5 for (i in 1..5 step 2) { print($i ) } println() // 反向步长输出 10 8 6 4 2 for (i in 10 downTo 1 step 2) { print($i ) } println() // 浮点区间使用 step 需注意精度 for (i in 0.0..1.0 step 0.25) { print($i ) } println() }运行结果1 3 5 10 8 6 4 2 0.0 0.25 0.5 0.75 1.04. 循环控制语句break 与 continuebreak用于立即终止整个循环continue用于跳过当前迭代、进入下一次循环。两者都可以配合标签Label实现更精确的控制。4.1 break 与 continue 基础用法fun main() { // break找到第一个偶数后终止循环 for (i in 1..10) { if (i % 2 0) { println(找到第一个偶数: $i) break } } // continue跳过奇数只输出偶数 for (i in 1..10) { if (i % 2 ! 0) { continue } print($i ) } println() }运行结果找到第一个偶数: 2 2 4 6 8 104.2 标签与嵌套循环在嵌套循环中普通的break只能跳出最内层循环。使用标签可以跳出指定层级的循环。fun main() { // 使用标签跳出外层循环 outer for (i in 1..3) { for (j in 1..3) { if (i 2 j 2) { println(命中 (i$i, j$j)跳出外层循环) breakouter } println(i$i, j$j) } } println(--- 分割线 ---) // 使用标签 continue 跳过外层循环的当前迭代 outer for (i in 1..3) { for (j in 1..3) { if (j 2) { println(跳过外层 i$i 的剩余迭代) continueouter } println(i$i, j$j) } } }运行结果i1, j1 i1, j2 i1, j3 i2, j1 命中 (i2, j2)跳出外层循环 --- 分割线 --- i1, j1 跳过外层 i1 的剩余迭代 i2, j1 跳过外层 i2 的剩余迭代 i3, j1 跳过外层 i3 的剩余迭代5. 遍历集合的高级用法Kotlin 标准库为集合遍历提供了丰富的扩展函数这些函数往往比传统的for循环更简洁、更安全。5.1 forEach 与 forEachIndexedfun main() { val numbers listOf(10, 20, 30, 40) // forEach 遍历 numbers.forEach { number - println(值: $number) } // forEachIndexed 同时获取索引 numbers.forEachIndexed { index, number - println(索引 $index 的值是 $number) } }运行结果值: 10 值: 20 值: 30 值: 40 索引 0 的值是 10 索引 1 的值是 20 索引 2 的值是 30 索引 3 的值是 405.2 遍历 Mapfun main() { val scores mapOf(Alice to 90, Bob to 85, Charlie to 95) // 遍历键值对 for ((name, score) in scores) { println($name 的分数是 $score) } // 使用 forEach 遍历 scores.forEach { (name, score) - println($name: $score) } // 只遍历键或值 for (name in scores.keys) { println(学生: $name) } for (score in scores.values) { println(分数: $score) } }运行结果Alice 的分数是 90 Bob 的分数是 85 Charlie 的分数是 95 Alice: 90 Bob: 85 Charlie: 95 学生: Alice 学生: Bob 学生: Charlie 分数: 90 分数: 85 分数: 956. 实战案例综合运用循环控制下面通过两个完整的实战案例展示循环控制在真实场景中的综合运用。6.1 案例一打印九九乘法表fun main() { for (i in 1..9) { for (j in 1..i) { print($j x $i ${i * j}\t) } println() } }运行结果1 x 1 1 1 x 2 2 2 x 2 4 1 x 3 3 2 x 3 6 3 x 3 9 1 x 4 4 2 x 4 8 3 x 4 12 4 x 4 16 1 x 5 5 2 x 5 10 3 x 5 15 4 x 5 20 5 x 5 25 1 x 6 6 2 x 6 12 3 x 6 18 4 x 6 24 5 x 6 30 6 x 6 36 1 x 7 7 2 x 7 14 3 x 7 21 4 x 7 28 5 x 7 35 6 x 7 42 7 x 7 49 1 x 8 8 2 x 8 16 3 x 8 24 4 x 8 32 5 x 8 40 6 x 8 48 7 x 8 56 8 x 8 64 1 x 9 9 2 x 9 18 3 x 9 27 4 x 9 36 5 x 9 45 6 x 9 54 7 x 9 63 8 x 9 72 9 x 9 816.2 案例二筛选质数fun main() { val limit 50 val primes mutableListOfInt() for (num in 2..limit) { var isPrime true for (divisor in 2 until num) { if (num % divisor 0) { isPrime false break } } if (isPrime) { primes.add(num) } } println(1 到 $limit 之间的质数: $primes) }运行结果1 到 50 之间的质数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]7. 循环中的常见陷阱与最佳实践在使用循环时有一些常见的陷阱需要特别注意同时也有一些最佳实践可以帮助写出更健壮的代码。7.1 常见陷阱无限循环忘记更新循环变量或条件永远为真会导致程序卡死。例如while (true)且没有break出口。区间边界混淆1..5包含 5而1 until 5不包含 5混用容易导致边界错误。在循环中修改集合遍历List时直接调用add或remove可能抛出ConcurrentModificationException应使用迭代器或先收集再修改。浮点步长精度问题使用浮点数作为步长时可能产生精度误差建议使用整数索引或BigDecimal。7.2 最佳实践优先使用区间和集合函数能用for (i in 1..10)就不要手写while加计数器。善用forEach等函数式遍历代码更简洁且天然避免索引越界问题。使用标签时保持代码可读标签命名要有意义避免滥用导致逻辑混乱。循环体尽量短小过长的循环体应拆分为独立函数提升可读性和可测试性。注意break和continue的使用场景能用条件判断替代时优先使用条件判断减少控制流跳转。8. 总结本文系统介绍了 Kotlin 循环控制的各个方面从基础的for、while、do-while循环到区间与步长控制再到break、continue和标签的高级用法最后通过实战案例展示了循环在真实场景中的应用。掌握这些知识后读者可以在日常开发中根据具体场景选择最合适的循环方式写出既高效又易读的 Kotlin 代码。
延伸阅读

更多相关文章

2026/10/19 23:51:53

OOP为什么存在?面向对象解决的真实工程痛点

把“继承”“封装”“多态”背下来很简单,难的是想清楚一个问题:这些概念到底是为了解决什么才出现的。这篇文章不打算从“面向对象四大特性”的教科书定义讲起,而是直接回答一个问题——OOP 为什么存在。如果你写过程序,迟早会遇…

2026/10/21 12:46:44

配置更适合生产环境的coredump

简介 在文章gdb调试基础中,学习了gdb基础的调试命令和手法。但在实际开发过程中,除了调试手法之外,如何构建出适合生产环境的应用和依赖,gdb以什么样的规则还原崩溃现场的依赖,我们如何在开发环境下搭建出一套和生产环…

2026/10/19 15:36:51

数据中心租赁技术指南:从需求测算到业务迁移的实践要点

当大厂开始算起经济账时,数据中心租赁从备选方案变成了热门生意。这个趋势看起来是财务决策,落到基础设施团队面前却是一连串具体技术问题:业务要租多少机柜,单机柜按多大功率申请,网络接入选单线还是多线,…

2026/10/21 12:45:49

把决策从大模型里拆出来:Agent架构中的System One实践

把「决策」从大模型里拆出来,是我今年在 Agent 架构上做得最值的一笔投资。先说结论:不是所有事情都要让那个上千亿参数的大模型来拍板,很多高频、小颗粒、模式固定的决策,完全可以用一个极轻量的 System One 模型来接管。这个思路…

2026/10/21 12:45:49

AI可复现性挑战:从随机种子到环境固定的全链路方案

最近几年,AI行业最不缺的就是“跑通的模型”和“没法复现的结果”。坦白说,入行越久,我越觉得“AI可复现性”像个被低估的硬门槛——很多团队能训练出精度不错的模型,但换台机器、换个环境、甚至换个同学重新执行一遍,…

2026/10/21 12:45:49

详解Git安装:Windows/macOS/Linux全平台配置与避坑指南

Git 安装教程这个题目,看起来像是给新手准备的基础内容,但我在实际帮人排查环境时发现,很多写了两年代码的人,装 Git 这一步也未必真弄明白了。装完能敲出 git --version ,跟装到顺手、装到不耽误后续开发&#xff0…

2026/10/21 12:45:49

AI漫剧规模化生产:从剧本到成片的完整工作流拆解

1. 项目概述与整体思路1.1 为什么AI漫剧能跑通"规模化"这条路先说结论:AI漫剧不是传统动画的替代品,而是一个全新的内容品类。它把动画制作从"人力密集型"彻底转成"算力密集型",这才是它能规模化的根本原因。过…

2026/10/21 12:45:49

740M多模态嵌入模型如何实现离线RAG落地

1. 项目概述:为什么740M的多模态嵌入模型突然成了RAG落地的关键支点“EmbeddingGemma 2:740M 多模态嵌入怎么跑离线 RAG”——这个标题一出来,我手边刚泡好的第三杯茶就凉了。不是因为技术太冷门,恰恰相反,它热得发烫&…

2026/10/21 12:40:48

LangChain + RAG实战:构建企业知识库问答系统的完整指南

做应用开发,总要面对一个尴尬:大模型看起来什么都懂,但一旦问到你们公司的报销制度、项目记录、售后口径,它就露馅了——要么不知道,要么编一个像模像样的答案。这也是这几年大模型落地时最常被追问的问题。RAG&#x…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑