kotlin(2):控制流
控制流
1.if表示式
If可以返回一個值
使用:
val v = if(3>4) 5 else 1
If的分支可以使程式碼塊,最後的表示式作為該塊的值,如果使用if作為表示式而不是語句,該表示式需要有else分支
2.when表示式
When取代了switch,不會順序執行,when將引數和所有的分支條件順序比較,直到某個分支滿足條件,when既可以被當做表示式使用也可以當做語句使用,如果被當做表示式,符號條件的分支的值就是整個表示式的值,如果當做語句使用,則忽略個別分支的值(像if一樣,每一個分支可以是一個程式碼塊
如果其他分支都不滿足條件就會求值else分支,如果when作為一個表示式使用,則必須有else分支,除非編譯器能夠檢測出所有的可能情況都已經覆蓋了.
如果很多分支需要用相同的方式處理,則可以把多個分支條件放在一起,用逗號分隔
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
可以使用任意表達式作為分支條件
when (x) { parseInt(s) -> print("s encodes x") else -> print("s does not encode x") }
也可以檢測一個值在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 如果不提供引數,所有的分支條件都是簡單的布林表示式,當順序執行的一個分支的條件為真的時候就執行該分支
val age = 16
when {
true -> {print("age == 3")}//執行 並終止
true -> {print("age == 2")}
else -> {
print("age is neither 3 nor 2")
}
}
3.for迴圈
for迴圈可以對任何提供迭代器(iterator)的物件進行遍歷
for(item in collection) print(item)
具有迭代器的物件需要的條件:
A.有一個成員函式或者擴充套件函式iterator()
B.有一個成員函式或者擴充套件函式next()
C.有一個成員函式或者擴充套件函式hasNext() 返回boolean
這三個函式都需要標記為operator
對陣列的for迴圈會被編譯為並不建立迭代器的基於索引的迴圈
for(i in array.indices) {
Print(array[i])
}
或者可以用庫函式withIndex:
for((index,value) in array.withIndex()) {
Print(“$index is $value”)
}
4.while迴圈
同java一樣
5.跳轉
在kotlin中任何表示式都可以用標籤來標記,標籤的格式為識別符號後跟@符號,例如:[email protected]
[email protected] for (i in 1..100) {
[email protected] for(j in 1..100) {
if(i == 50) [email protected]
}
}
Kotlin有函式字面量,區域性函式和物件表示式,因此kotlin的函式可以被巢狀,標籤限制的return允許我們從外層函式返回,最重要的一個用途就是從lambda表示式中返回
fun foo(){
val arr = arrayOf(1,2,3)
arr.forEach{
print(it)
if (it == 2) [email protected]//結束的是forEach 會執行print(“end”)
}
print("end")
}