Kotlin 控制流語句
在kotlin中我們可以使用if、when、for、while這幾種控制流語句。與java不同的是,kotlin取消了傳統的switch語句而改用when語句來實現。
if表示式
語法格式:
if (used by atomicExpression)
: "if" "(" expression ")" controlStructureBody SEMI? ("else" controlStructureBody)?
;
首先我們看下傳統用法:
var number = 20; if (number > 15) { print("The number is more than 15") }
我們同樣可以使用if…else if …else這樣在其他語言中存在的習慣用法:
var number = 15;
if (number > 20) {
print("The number is more than 20")
} else if (number == 20) {
print("The number is equals")
} else {
print("The number is less than 20")
}
如果你的條件分支超過3條,那麼kotlin會建議你採用when這種更加簡潔的方式:
接下來我們看一下在kotlin中if作為表示式的使用:
var stuNumber = 55;
var stu = if (stuNumber > 50) 50 else stuNumber
print(stu)
輸出:
50
在這裡,if作為一個表示式(例如:返回它的值或者把它賦給變數),也就是意味著它可以返回一個值,在這種情況下,else分支是必須的。如果上面的例子沒有else分支,那麼你會得到如下的錯誤提示:
同樣的,作為表示式使用的時候,if的分支可以是程式碼塊,最後的表示式作為該塊的值:
var stuNumber = 15; var maxStu = if (stuNumber > 50) { print("The students max number is 50") 50 }else{ print("The students number is $stuNumber") stuNumber } print("\n") print(maxStu)
輸出:
The students number is 15
15
如果我們試著在if和else分支塊的末尾加一句程式碼:
var maxStu = if (stuNumber > 50) {
...
true
}else{
...
false
}
結果輸出:
false
所以有一點大家的記清楚了,if作為表示式:最後的表示式作為該塊的值。
When 表示式
when表示式的語法在kotlin的文件中我們也可以找到:
when (used by atomicExpression)
: "when" ("(" expression ")")? "{"
whenEntry*
"}"
;
whenEntry (used by when)
: whenCondition{","} "->" controlStructureBody SEMI
: "else" "->" controlStructureBody SEMI
;
whenCondition (used by whenEntry)
: expression
: ("in" | "!in") expression
: ("is" | "!is") type
;
最簡單的使用就和我們以前知道的switch是一樣的:
var index = 1
when (index) {
1 -> {
print("index is 1")
}
2 -> {
print("index is 2")
}
else -> {
print("index is 1")
}
}
其中如果是簡單的程式碼塊我們也可以使用kotlin官方示例的寫法,不用花括號進行程式碼塊的標識,當然了額,個人意見,使用{}將分支的程式碼包裹起來,可以讓我們更容易區分程式碼結構。
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個塊
print("x is neither 1 nor 2")
}
}
when 將它的引數與所有的分支條件順序比較,直到某個分支滿足條件。如果 when 作為一個表示式使用,則必須有 else 分支, 除非編譯器能夠檢測出所有的可能情況都已經覆蓋了[例如,對於 列舉(enum)類條目與密封(sealed)類子型別]。
也就是說任何情況下我們提供一個else分支是沒有任何壞處的,這就相當於switch的default分支。
記得swicth如果有多分支需要用相同的方式處理,一般的寫法應該是:
case 1:
case 2:
break;
這樣的形式,在kotlin中是將多個分支條件放在一起,用逗號分隔:
1, 2, 3, 4 -> {
print("index is $index")
}
我們也可以檢測一個值在(in)或者不在(!in)一個區間或者集合中:
var index = 4
when (index) {
in 1..3 -> {
print("index is less than 3")
}
!in 1..3 -> {
print("index is more than 3")
}
}
還有一種就是檢測一個值是(is)或者不是(!is)一個特定型別的值:
var a: Any = "100"
when (a) {
is Char -> print("char")
!is Number -> print("not number")
else -> print("unknow")
}
這裡提示大家一個小技巧,如果我們使用when表示式的時候,不能確定傳入的引數a的型別,此時我們在宣告變數的時候就將其宣告為Any型別:
var a: Any = "100"
如果我們不指定型別:
程式無法通過編譯,提示我們衝突的型別。
另外就是和if一樣作為表示式的用法了:
var results = when (a) {
is Char -> "char"
!is Number -> "not number"
else -> "unknow"
}
如果它被當做表示式, 符合條件的分支的值就是整個表示式的值,這一點大家在使用的時候的自己注意。
迴圈語句
常見的for、while、do…while語法和我們以前接觸的大同小異:
for (used by loop)
: "for" "(" annotations (multipleVariableDeclarations | variableDeclarationEntry) "in" expression ")" controlStructureBody
;
while (used by loop)
: "while" "(" expression ")" controlStructureBody
;
doWhile (used by loop)
: "do" controlStructureBody "while" "(" expression ")"
;
for 迴圈
for 可以迴圈遍歷任何提供了迭代器的物件,這相當於像 C# 這樣的語言中的 foreach 迴圈.
var array: Array<Int> = Array(5) { i -> i + 1 }
for (value in array){
print(value)
}
對於某些特殊場景比如我們需要索引的時候,我們可以通過下面兩種方式獲得索引值:
for (value in array.indices){
print(value)
}
如果我們列印一下array.indices的值大家就會發現 ,它返回的其實是陣列的索引範圍:
0..4
通過這種變相的方式為我們提供了元素的索引值。另外一種方式是:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
for的另一種使用場景就是區間迭代:
for (i in 1..3) {
println(i)
}
這和我們使用array.indices的原理是一致的。
while語句的使用我們就簡單的使用官方文件內容:
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y 在此處可見