当前位置: 首页 > article >正文

Kotlin while 和 for 循环(九)

导读大纲

    • 1.1 while 和 for 循环
      • 1.1.1 while 循环
      • 1.1.2 范围和级数:for循环

1.1 while 和 for 循环

  1. Kotlin 中的迭代与 Java、C# 或其他语言中的迭代非常相似
    • while 循环与其他语言中的传统形式相同, 只需简单了解一下即可
    • 还会发现 for 循环,其写法为 for ( in )
      1. 是不是会想起 Java 的 for-each 循环

1.1.1 while 循环

  1. Kotlin 有 while 循环和 do-while 循环,可能对其他编程语言的语法并不陌生
    • do-while 与 while 的区别只在于前者会无条件执行一次循环体
while (condition) {
    
    if (shouldExit) break
}
do {
    if (shouldSkip) continue
    
} while (condition)
  1. 对于嵌套循环,Kotlin 允许您指定一个标签
    • 标签是一个标识符,后跟 at 符号(@)
    • 然后在使用 break 或 continue 时引用该标签
    • <1> 用 outer 标签标记循环
    • <2> break和 continue不带标签, 针对的就是离它最近的那个循环体
    • <3> break和 continue使用标签, 针对指定循环,即这里针对最外层循环体
outer@ while (outerCondition) {                // <1>
    while (innerCondition) {
        if (shouldExitInner) break             // <2>
        if (shouldSkipInner) continue          // <2>
        if (shouldExit) break@outer            // <3>
        if (shouldSkip) continue@outer         // <3>
    // ...
    }
    // ...
}

1.1.2 范围和级数:for循环

  1. 正如我们刚才提到的,在 Kotlin 中没有 C 风格的 for 循环

    • 初始化一个变量,在循环的每一步中更新其值
      1. 在值达到某个界限时退出循环
    • 比如C语言中经典的for(int i = 0; i < 10; i++)循环样式
      1. 为了取代此类循环,Kotlin 使用 range 的概念
  2. range本质上只是两个值(通常是数字)之间的间隔: 即起点和终点

    • 可以使用两个点来书写它: val oneToTen = 1…10
    • 请注意,在 Kotlin 中,这些范围是封闭的或包含的
      1. 这意味着总是包含左右两个边界值
        title
    • 对于整数范围,最基本的操作就是循环遍历所有数值
      1. 如果可以遍历一个范围内的所有值,那么这个范围就称为级数
  3. 让我们用整数范围来玩 Fizz-Buzz 游戏

    • 玩 "Fizz-Buzz "游戏时,玩家轮流递增计数
      1. 用"fizz"代替任何能被3整除的数字
      2. 用 "buzz "代替任何能被 5 整除的数字
      3. 如果一个数字同时是 3 和 5 的倍数,就说: “Fizz-Buzz”
    • <1> 遍历整数范围 1…100
fun fizzBuzz(i: Int) = when{
    i % 15 == 0 -> "FizzBuzz"
    i % 3 == 0 -> "Fizz"
    i % 5 == 0 -> "Buzz"
    else-> "$i "
}
fun main() {
    for (i in 1..100){           // <1>
        fizzBuzz(i)
    }
}
  1. 让我们从 100 开始倒数,只包括偶数
    • <1> 你正在迭代一个有步长的级数,这样就可以跳过一些数字
      1. 这里100 downTo 1 是一个向后的级数(步长默认为1),step 将步进改为 2
    • 简单说Kotlin中 1…100 和 100 downTo 1来控制增长的方向
      1. 前者是正向, 后者是负向, 同时使用 step 来设置步进值
fun main() {
    for (i in 100 downTo 1 step 2){          // <1>
        println(fizzBuzz(i))
    }
}
  1. 上面使用的是range都是全包围, 即包含左右两个边界值
    • 还可以使用"…< size"半包围语法来排除右侧边界值
      1. 等价于"… size-1"
@OptIn(ExperimentalStdlibApi::class)
fun main() {
    for (i in 1..<5) {
        println(i)
    }
}
====================================
1
2
3
4

http://www.kler.cn/news/315833.html

相关文章:

  • CQRS模型解析
  • 计算机信息系统安全保护等级
  • What is new in .NET 8 and C#12
  • oracle 事务的管理
  • 3.《DevOps》系列K8S部署CICD流水线之部署MetalLB负载均衡器和Helm部署Ingress-Nginx
  • [MySQL]数据库修复(Example:1146 Error )
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17
  • 【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论
  • 【Lua坑】Lua协程coroutine无法正常完整执行问题
  • 云盘视频保护神器,支持云盘视频加密与在线播放,配合alist使用,超完美!
  • react + antDesignPro 企业微信扫码登录
  • MySQL缓冲池详解
  • react router v6
  • LLaMA-Factory 使用 alpaca 格式的数据集
  • 【Delphi】通过 LiveBindings Designer 链接控件示例
  • Java笔试面试题AI答之设计模式(5)
  • affine: python仿射变换包
  • 【题解】—— LeetCode一周小结38
  • 解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列
  • 周邦彦,北宋文坛的独特乐章
  • 前端工程化4:从0到1构建完整的前端监控平台
  • 自动化生成与更新 Changelog 文件
  • 花生壳、神卓互联等主流内网穿透技术分享
  • FTP服务
  • 编译 Android 11源码
  • 人工智能(AI)的影响下人类的生活样子
  • Shell 脚本学习
  • STM32 单片机最小系统全解析
  • Vue子组件样式受到父组件污染
  • 【C++11】异常处理