发布时间:2026/8/31 6:52:56
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/8/31 6:52:56

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

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

2026/8/31 6:47:56

配置更适合生产环境的coredump

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

2026/8/31 6:47:56

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

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

2026/8/31 7:02:56

视频生成规模化应用:国产算力平台技术架构与工程实践

智象未来与商汤大装置的合作动向,最近在视频生成圈子里讨论热度不低。关键字不多,但方向很明确:国产算力、视频生成、规模化应用。这次我们不看概念,先拆一下这条链路到底怎么跑通:视频生成模型从实验室单卡变成对外可…

2026/8/31 7:02:56

箭头函数与this绑定:从原理到场景的完整排查指南

箭头函数是 ES6 里最常用的语法之一,但它真正解决的其实不是“写法更短”这件事,而是 JS 里最折磨人的 this 绑定问题。很多人刚开始只记住了() > {}比function() {}少几个字母,等到写事件回调、setTimeout、对象方法的时候,发…

2026/8/31 7:02:56

DeepSeekHarness Docker部署与插件安装实战指南

最近在折腾 DeepSeekHarness 的容器化部署,发现 Docker 版已经更新到最新版本,而且直接支持插件安装。之前很多朋友反馈说插件目录找不到、装完插件不生效、镜像拉取慢等问题,我这边把完整的部署和插件配置流程重新梳理了一遍。这篇文章会从环…

2026/8/31 6:57:56

Windows许可证能退款吗?类型、条件与操作流程详解

当你买了新电脑或单独购买了 Windows 许可证,却因为各种原因不再需要它时,很自然会想问一个问题:Windows 许可证能退款吗?这个问题在开发者、企业采购和普通用户之间其实经常出现。有人是因为预装系统的电脑退货了,有人…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/31 2:14:20

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/31 1:41:28

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/31 0:07:32

STM32C5设备支持包(IAR DFP)安装指南与常见坑

上一阵子在IAR里折腾一块基于STM32C5系列的新板子,工程从STM32CubeMX导出来之后怎么都编译不过。报错信息很干脆:找不到设备描述文件。跟着错误路径去查,发现指向的是一个让我愣了一下的名字:STMicroelectronics.stm32c5xx.2.1.0.…

2026/8/31 0:07:32

STM32N657 SWO引脚矛盾:CubeMX显示PB3,数据手册为PB5

拿到STM32N657这颗料的第一天,我就撞上了一个让人原地懵圈的引脚矛盾:CubeMX里清清楚楚显示SWO在PB3,翻开数据手册的引脚说明表,却赫然写着PB5。对于一个靠SWO输出调试日志吃饭的人而言,这种"工具和手册打架"…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/31 6:53:02

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…