說在前面,程序語言的控制是程序設計中比較基礎的語法,如果大家有一定的語法基礎,可以粗略看一下本章節,
知道條件控制和循環控制在Kotlin中是如何使用的即可。
1、if 表達式
一個 if 語句包含一個布爾表達式和一條或多條語句。
// 傳統用法
var max = a
if (a < b) max = b
// 使用 else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 作為表達式
val max = if (a > b) a else b
我們也可以把 IF 表達式的結果賦值給一個變量。
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
這也說明我也不需要像Java那種有一個三元操作符,因為我們可以使用它來簡單實現:
val c = if (condition) a else b
使用區間
使用 in 運算符來檢測某個數字是否在指定區間內,區間格式為 x..y :
實例:
fun main(args: Array<String>) {
val x = 5
val y = 9
if (x in 1..8) {
println("x 在區間內")
}
}
2、When 表達式
when 將它的參數和所有的分支條件順序比較,直到某個分支滿足條件。
when 既可以被當做表達式使用也可以被當做語句使用。如果它被當做表達式,符合條件的分支的值就是整個表達式的值,如果當做語句使用, 則忽略個別分支的值。
when 類似其他語言的 switch 操作符。其最簡單的形式如下:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個塊
print("x 不是 1 ,也不是 2")
}
}
在 when 中,else 同 switch 的 default。如果其他分支都不滿足條件將會求值 else 分支。
如果很多分支需要用相同的方式處理,則可以把多個分支條件放在一起,用逗號分隔:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
我們也可以檢測一個值在(in)或者不在(!in)一個區間或者集合中:
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
另一種可能性是檢測一個值是(is)或者不是(!is)一個特定類型的值。注意: 由于智能轉換,你可以訪問該類型的方法和屬性而無需 任何額外的檢測。
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when 也可以用來取代 if-else if鏈。 如果不提供參數,所有的分支條件都是簡單的布爾表達式,而當一個分支的條件為真時則執行該分支:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
3、For 循環
for 循環可以對任何提供迭代器(iterator)的對象進行遍歷,語法如下:
for (item in collection) print(item)
循環體可以是一個代碼塊:
for (item: Int in ints) {
// ……
}
如上所述,for 可以循環遍歷任何提供了迭代器的對象。
如果你想要通過索引遍歷一個數組或者一個 list,你可以這么做:
var array = arrayListOf("object0","object1","object2") //這里數組的聲明也和java不一樣
for(i in array.indices){ //使用索引遍歷
println(array[i])
}
注意這種"在區間上遍歷"會編譯成優化的實現而不會創建額外對象。
或者你可以用庫函數 withIndex:
for((index,value) in array.withIndex()){
println("the element at $index is $value")
}
實例:對集合進行迭代:
//遍歷一個集合
val items = listOf("apple","banana","kiwi")
for(item in items){
println(item)
}
while 與 do...while 循環
while是最基本的循環,它的結構為:
while( 布爾表達式 ) {
//循環內容
}
do…while 循環 對于 while 語句而言,如果不滿足條件,則不能進入循環。但有時候我們需要即使不滿足條件,也至少執行一次。
do…while 循環和 while 循環相似,不同的是,do…while 循環至少會執行一次。
do {
//代碼語句
}while(布爾表達式);
實例:
//while與do...while循環
var x = 5
while(x > 0){
println(x--)
}
var y = 5
do{
println(y--)
}while(y>0)
返回和跳轉
Kotlin 有三種結構化跳轉表達式:
return。默認從最直接包圍它的函數或者匿名函數返回。
break。終止最直接包圍它的循環。
continue。繼續下一次最直接包圍它的循環。
在循環中 Kotlin 支持傳統的 break 和 continue 操作符。
//循環中的返回和跳轉
for(i in 1..10){
for(i in 1..10){
if(i==3)continue //i為3時跳出當前循環,繼續下一下循環
println(i)
if(i>5)break //i為6時跳出循環
}
}
Break 和 Continue 標簽
在 Kotlin 中任何表達式都可以用標簽(label)來標記。 標簽的格式為標識符后跟 @ 符號,例如:abc@、fooBar@都是有效的標簽。 要為一個表達式加標簽,我們只要在其前加標簽即可。
loop@ for (i in 1..100) {
// ……
}
現在,我們可以用標簽限制 break 或者continue:
//使用標簽結束循環
loop@for(i in 1..100){
for(j in 1..100){
if(j==50)break@loop
}
}
標簽限制的 break 跳轉到剛好位于該標簽指定的循環后面的執行點。 continue 繼續標簽指定的循環的下一次迭代。