流程控制
與Java類似,Kotlin同樣提供了兩種基本的流程控制結構:分支結構和循環結構。
Kotlin提供了 if 和 when 兩種分支語句,其中 when 語句可以代替Java的switch語句,且功能更強大;Kotlin提供了 while 、do while 、for-in 循環,抛棄了Java原有的普通for循環。Kotlin也提供了 break 和 continue 來控制循環結構。
4.1 分支結構
4.2.1 if 分支
Kotlin中的 if 分支既可以作為語句使用,也可以作為表達式使用。
//作為語句使用的三種形式:
//形式1
if (expression) {
statements...
}
//形式2
if (expression) {
statements...
} else {
statements...
}
//形式3
if (expression) {
statements...
} else if (expression) {
statements...
}
...
// 注意:使用if else語句時,一定要先處理範圍更小的情況
4.2.2 if 表達式
// if 作為表達式使用時:
var age = 20
//将if表達式指派給str
var str = if (age > 20) "age大于20" else if (age < 20) "age小于20"
else "age等于20"
//由上述代碼可知,當if分支作為表達式使用時,整個if表達式最終會傳回一個值,是以我們可以
//用它來代替Java中的三目運算符。
//注意:if表達式必須要有傳回值
4.2.3 when分支語句
when分支取代了Java中原有的switch語句。
var score = 'B'
when (score) {
'A' -> {
println("You get a A !")
}
'B' -> {
println("You get a B !")
}
'C' -> {
println("You get a C !")
}
'D' -> {
println("You get a D !")
}
else -> {
println("Flunk !")
}
}
when分支相對于switch分支的改進:
- when分支可以比對多個值。
- when分支後的值不要求是常量,可以是任意表達式。
- when分支對條件表達式的類型沒有任何要求。
// when分支可以比對多個值
var score = 'B'
when (score) {
'A', 'B' -> {
println("優秀")
}
'C', 'D' -> {
println("良好")
}
}
// when分支後的值不要求是常量,可以是任意表達式
var score = 'B'
var str = "EFGH"
when (score) {
str[0] - 4, str[1] - 4 -> {
println("優秀")
}
str[2] - 4, str[3] - 4 -> println("良好")
}
// when分支的條件表達式可以是任意類型
var date = Date()
when (date) { // 以Date類型作為when的條件表達式
Date() -> {
println("666")
}
else -> {
println("555")
}
}
4.2.4 when 表達式
與 if 分支相同,when分支也可以作為表達式使用。when表達式必須有傳回值,是以when表達式必須有else分支。
var score = 'B'
val str = when (score) {
'A' -> {
println("666")
"優秀"
}
'B' -> {
println("it's ok")
"良好"
}
else -> {
println("555")
"不及格"
}
}
println(str) //輸出:良好
4.2.5 when 分支處理範圍
通過使用 in 、 !in 運算符,我們還可以使用when分支檢查表達式是否位于指定區間或集合中。
val age = java.util.Random().nextInt(100)
//通過when表達式對str指派
var str = when (age) {
in 10..25 -> "年輕人"
in 25..50 -> "中年人"
in 51..80 -> "老年人"
else -> "牛人"
}
4.2.6 when 分支處理類型
通過使用 is 、!is 運算符,我們可以使用when分支檢查表達式是否為指定類型。
var element: String = "hello world"
when (element) {
is String -> println("String類型")
is Int -> println("Int類型")
is Double -> println("Double類型")
else -> println("其他類型")
}
4.2.7 when條件分支
我們可以用when分支來代替 if…else if 鍊,具體代碼不做贅述。
4.3 循環結構
4.3.1 while循環
與Java相同,不做贅述。
4.3.2 do while 循環
同上。
4.3.3 for - in 循環
for - in 循環格式如下:
for (常量名 in 字元串 | 範圍 | 集合) {
statements...
}
上述文法格式有兩點需要注意:
-
。 for - in 循環中的常量會在每次循環開始前自動被指派,是以該常量無需提前聲明。for - in 循環中的常量無需聲明
-
。所謂的可疊代對象就是該對象包含一個iterator()方法,且該方法的傳回值對象具有next()、hasNext()方法。for - in 循環可以周遊任何可疊代對象
//for-in循環的簡單使用
for (num in 2..5) {
println(num)
}
注意:for - in 循環中的循環計數相當于一個用val聲明的常量,是以程式不允許在for - in循環中對循環計數器進行指派。
for (num in 2..5) {
println(num)
num = 8; //對循環計數器num進行指派會報錯
}
4.3.4 嵌套循環
與Java相同,不做贅述。
4.4 循環控制結構
Kotlin提供了
continue
和
break
來控制循環結構,除此之外還可以使用
return
來結束整個方法。
4.4.1 使用 break 結束循環
Kotlin中的break語句基本與Java類型,不過有一點值得一提:在Kotlin中,break語句不僅可以結束其所在的循環,還可以直接結束其外層循環。此時需要在break後緊跟一個标簽,用于辨別一個外層循環。
Kotlin中的标簽就是一個緊跟着@的辨別符。Kotlin中的标簽隻有放在循環語句之前才起作用。
//外層循環,用outer辨別
[email protected] for (i in 0 until 5) {
//内層循環
for (j in 0 until 3) {
println("i = ${i}, j = ${j}")
if (j == 2) {
break@outer //該break不是結束其所在的循環,而是結束outer所辨別的循環
}
}
}
4.4.2 使用 continue 忽略本次循環剩下的語句
使用同break語句,不做贅述。
4.4.3 使用return結束方法
同Java,不做贅述。