我们有时希望程序能够根据不同的条件来决定是否执行某些代码段(条件判断),或者反复执行某段代码直到满足特定条件为止(循环),这些功能的实现方式统称为「流程控制」;本文介绍 Kotlin 的流程控制 。本文出现的所有代码均可在Kotlin 官方在线代码调试器运行,部分代码下方也会提供链接直达。
专栏《零基础入门 Kotlin》持续更新中,欢迎订阅!
目录
1. 条件判断
if
if
用于判断条件是否成立,若成立,则执行指定代码:
val a = 3
val b = 2
if(a>b){
println("a 比 b 大")
}else{
println("b 比 a 大")
}
// a 比 b 大
上面代码中,if
后面紧跟小括号,若小括号里的条件表达式成立,则执行小括号后面大括号包裹的代码;否则执行 else
后面大括号里面的代码。
条件表达式 a>b
返回的是布尔值 true
,你也可以直接将布尔值写在条件判断里:
if(true){
println("true")
}else{
println("false")
}
// true
更多条件表达式可以查看 Kotlin 入门教程:运算符。
如果有多个条件需要判断,可以使用 else if
:
val a = 2
val b = 2
if(a>b){
println("a 比 b 大")
}else if(a == b){
println("a 等于 b")
}else{
println("b 比 a 大")
}
// a 等于 b
上面代码首先判断a
是否大于b
,如果成立,则打印"a比b大"
。 如果不成立,则进入下一个判断,判断a
是否等于b
,如果成立,则打印"a等于b"
。 如果以上两个条件都不成立,则执行else
语句,打印"b比a大"
。
注意,else if
语句判断成功后,就不会继续往下执行:
val a = 3
if(a>3){
println("a>3")
}else if(a>2){
println("a>2")
}else if(a>1){
println("a>1")// 不会执行
}else{
println("a>0")// 不会执行
}
// a>2
上面代码首先判断a是否大于3,如果是则打印"a>3"。但是,因为a的值为3,所以不满足条件,不执行这个分支;接着判断a是否大于2,如果是则打印"a>2"。因为a的值为3,满足条件,所以执行这个分支,打印"a>2";后面将不再继续判断,因为已经找到满足条件的分支了。最终的结果是打印"a>2"。
when
when
可以看作 else if
的一种简便写法:
val a = 3
if(a>3){
println("a>3")
}else if(a>2){
println("a>2")
}else if(a>1){
println("a>1")// 不会执行
}else{
println("a>0")// 不会执行
}
//等价于
when {
a > 3 -> println("a>3")
a > 2 -> println("a>2")
a > 1 -> println("a>1") // 不会执行
else -> println("a>0") // 不会执行
}
上面代码使用了 Kotlin 的 when
表达式替换 else if
。when
后面紧跟大括号,大括号内用箭头 ->
连接条件表达式和代码块。如果代码块不止一行语句,需要用大括号包裹:
val a = 3
when {
a > 3 -> println("a>3")
a > 2 -> {
println("a<3")
println("a>2")
}
a > 1 -> println("a>1")
else -> println("a>0")
}
// a<3
// a>2
when
的另一种用法和 C 语言的 switch
相似:
val obj = "Hello"
val result = when (obj) {
// If obj equals "1", sets result to "one"
"1" -> "One"
// If obj equals "Hello", sets result to "Greeting"
"Hello" -> "Greeting"
// Sets result to "Unknown" if no previous condition is satisfied
else -> "Unknown"
}
println(result)
// Greeting
上面代码使用了Kotlin中的when表达式来对obj进行条件判断和匹配。当obj等于"1"
时,将 result
设置为 "One"
。 当obj等于"Hello"
时,将result
设置为"Greeting"
。 当obj不匹配前面的条件时,将result设置为"Unknown"
。
2. 循环
在 Kotlin 中,for
和 while
循环是用来重复执行一段代码直到满足某个条件为止的基本结构。
2.1 范围(range)
在 Kotlin 中,..
是一个范围定义运算符,它用来创建一个整数范围或者是字符范围。这个运算符可以用来生成一系列连续的值,通常与 for 循环一起使用来遍历这些值。
整数范围
当你想要创建一个包含一系列连续整数的范围时,可以使用 ..
。例如,创建一个从 1 到 5 的整数范围:
val range = 1..5
这个 range
对象包含了从 1 到 5 的所有整数。你可以使用 in
关键字来遍历这个范围内的每一个值:
for (i in 1..5) {
println(i)
}
// 输出: 1 2 3 4 5
字符范围
除了整数之外,..
运算符也可以用来创建字符范围。例如,创建一个从 ‘a’ 到 ‘e’ 的字符范围:
for (c in 'a'..'e') {
println(c)
}
// 输出: a b c d e
步长与闭区间
默认情况下,范围是一个闭区间,即它包括了起始值和结束值。同时,可以通过 step
参数来指定步长:
for (i in 1..10 step 2) {
println(i)
}
// 输出: 1 3 5 7 9
上面代码中,我们指定了步长为 2,因此输出的数字是从 1 开始每隔一个数字取一个值,直到 9。
另外,如果要声明一个不包括结束值的范围(range),可以使用 ..<
运算符。例如,1..<4
声明的范围的值为 1, 2, 3
。
要声明一个逆序的范围,请使用 downTo
。例如,4 downTo 1
声明的范围的值为 4, 3, 2, 1
。
2.2 for
for
循环通常用来遍历一个范围或者集合中的元素。在 Kotlin 中,你可以使用 in
关键字来定义一个从开始到结束的整数范围,或者用来遍历集合(如列表)中的每个元素:
// 遍历一个数字范围
for (i in 1..5) {
println(i)
}
// 输出: 1 2 3 4 5
// 遍历一个列表
val numbers = listOf(1, 2, 3, 4, 5)
for (number in numbers) {
println(number)
}
// 输出: 1 2 3 4 5
2.3 while
while
循环在给定条件为真的时候重复执行一段代码。如果条件不再为真,则退出循环:
var count = 0
while (count < 5) {
println("Count is $count")
count++
}
// 输出: Count is 0 Count is 1 Count is 2 Count is 3 Count is 4
// do...while 循环至少会执行一次,然后检查条件
do {
println("Count is still $count")
} while (--count > 0)
// 输出: Count is still 5 Count is still 4 ... Count is still 0
注意,在 do...while
循环中,条件是在执行完循环体之后才被检查的,因此至少会执行一次循环体内的代码。
2.4 break
和 continue
在 Kotlin 中,break
和 continue
是用来控制循环流程的关键字。它们可以在 while
或者 for
循环中使用,以改变循环的正常执行顺序。
break
break
关键字用来立即终止当前所在的循环,无论循环条件是否仍然为真。一旦执行 break
,程序将会跳出循环,继续执行循环之后的代码:
var i = 0
while (i < 10) {
if (i == 5) {
break // 当 i 等于 5 时,跳出循环
}
println(i)
i++
}
// 输出: 0 1 2 3 4
上面代码中,当变量 i
的值达到 5 时,break
语句被执行,导致循环提前终止,因此 5
并没有被打印出来。
// 创建一个数字列表
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
println("Using 'continue' to skip odd numbers:")
// 使用 continue 跳过奇数
for (number in numbers) {
if (number % 2 != 0) {
continue // 当前数字是奇数时跳过这次迭代
}
println(number)
}
println("\nUsing 'break' to exit the loop when a number is greater than 5:")
// 使用 break 在数字大于5时退出循环
for (number in numbers) {
if (number > 5) {
break // 当前数字大于5时结束循环
}
println(number)
}
运行代码
上面代码中,第一个 for 循环会打印出所有的偶数,而第二个 for 循环会在打印出任何大于5的数字之前终止。
continue
continue
关键字用来跳过当前循环体内剩余的部分,并立即开始下一次循环迭代。如果当前是最后一次迭代,则循环结束:
var i = 0
while (i < 10) {
i++
if (i % 2 == 0) {
continue // 当 i 是偶数时,跳过本次循环剩余部分并开始下一次迭代
}
println(i)
}
// 输出: 1 3 5 7 9
上面代码中,每当 i
是偶数时,continue
语句会被执行,这会导致跳过当前循环体内的剩余代码,并进行下一次迭代。因此,只有奇数被打印了出来。
标签化(label)的 break
和 continue
一般情况下,continue
和 break
都只是作用于内层循环,不会影响到外层循环。如果想要在内层循环中跳出外层循环,可以使用标签化(labeled)的 break
和 continue
来控制嵌套循环。通过给循环加上一个标识符标签,可以在一个外层循环中中断或跳过内层循环:
var i = 0
outer@ while (i < 10) {
var j = 0
while (j < 10) {
println("i=$i, j=$j")
if (i == 5 && j == 5) {
break@outer // 当 i 和 j 都为 5 时,跳出外层循环
}
j++
}
i++
}
上面代码中,使用了 outer@
标记外层循环。break@outer
会在满足条件时跳出标记的外层循环。