导读大纲
-
- [1.1 while 和 for 循环](#1.1 while 和 for 循环)
-
- [1.1.1 while 循环](#1.1.1 while 循环)
- [1.1.2 范围和级数:for循环](#1.1.2 范围和级数:for循环)
1.1 while 和 for 循环
- Kotlin 中的迭代与 Java、C# 或其他语言中的迭代非常相似
- while 循环与其他语言中的传统形式相同, 只需简单了解一下即可
- 还会发现 for 循环,其写法为 for ( in )
- 是不是会想起 Java 的 for-each 循环
1.1.1 while 循环
- Kotlin 有 while 循环和 do-while 循环,可能对其他编程语言的语法并不陌生
- do-while 与 while 的区别只在于前者会无条件执行一次循环体
kotlin
while (condition) {
if (shouldExit) break
}
do {
if (shouldSkip) continue
} while (condition)
- 对于嵌套循环,Kotlin 允许您指定一个标签
- 标签是一个标识符 ,后跟 at 符号(@)
- 然后在使用 break 或 continue 时引用该标签
- <1> 用 outer 标签标记循环
- <2> break和 continue不带标签, 针对的就是离它最近的那个循环体
- <3> break和 continue使用标签, 针对指定循环,即这里针对最外层循环体
kotlin
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循环
-
正如我们刚才提到的,在 Kotlin 中没有 C 风格的 for 循环
- 即初始化一个变量 ,在循环的每一步中更新其值
- 并在值达到某个界限时退出循环
- 比如C语言中经典的for(int i = 0; i < 10; i++)循环样式
- 为了取代此类循环 ,Kotlin 使用 range 的概念
- 即初始化一个变量 ,在循环的每一步中更新其值
-
range本质上只是两个值 (通常是数字)之间的间隔: 即起点和终点
- 可以使用两个点来书写它: val oneToTen = 1...10
- 请注意,在 Kotlin 中,这些范围是封闭的或包含的
- 这意味着总是包含左右两个边界值
- 这意味着总是包含左右两个边界值
- 对于整数范围 ,最基本的操作 就是循环遍历所有数值
- 如果可以遍历一个范围内的所有值 ,那么这个范围就称为级数
-
让我们用整数范围来玩 Fizz-Buzz 游戏
- 玩 "Fizz-Buzz "游戏时,玩家轮流递增计数
- 用"fizz"代替任何能被3整除的数字
- 用 "buzz "代替任何能被 5 整除的数字
- 如果一个数字同时是 3 和 5 的倍数,就说: "Fizz-Buzz"
- <1> 遍历整数范围 1...100
- 玩 "Fizz-Buzz "游戏时,玩家轮流递增计数
kotlin
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)
}
}
- 让我们从 100 开始倒数 ,只包括偶数
- <1> 你正在迭代一个有步长的级数 ,这样就可以跳过一些数字
- 这里100 downTo 1 是一个向后的级数 (步长默认为1),step 将步进改为 2
- 简单说Kotlin中 1...100 和 100 downTo 1来控制增长的方向
- 前者是正向, 后者是负向, 同时使用 step 来设置步进值
- <1> 你正在迭代一个有步长的级数 ,这样就可以跳过一些数字
kotlin
fun main() {
for (i in 100 downTo 1 step 2){ // <1>
println(fizzBuzz(i))
}
}
- 上面使用的是range都是全包围, 即包含左右两个边界值
- 还可以使用"...< size"半包围 语法来排除右侧边界值
- 等价于"... size-1"
- 还可以使用"...< size"半包围 语法来排除右侧边界值
kotlin
@OptIn(ExperimentalStdlibApi::class)
fun main() {
for (i in 1..<5) {
println(i)
}
}
====================================
1
2
3
4