原文地址
If Expression(if表達式)
在Kotlin,if是一個表達式,也就是它返回一個值.因此這里沒有三元操作符(condition?then:else),因為普通的if能做到這樣。
// Traditional usage
var max = a
if (a < b) max = b
// With else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// As expression
val max = if (a > b) a else b
If分支可以為代碼塊,并且最后一個表達式是塊的值。
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
如果你正在使用if作為一個表達式而不是陳述句(例如,返回它的值或者給它分配一個變量),那么這個表達式需要一個else分支。
參看 grammar for if
When Expression(When表達式)
When替換switch操作符像c那樣的語言,最簡單的樣式像這樣:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
When表達式順序的對比所有的分支直到一些分支的條件滿足來匹配它的參數。When能被作為表達式或者陳述語句使用。如果它被當做表達式使用,滿足的分支的值將變成全部表達式的值。如果它被當做陳述使用,獨立分支的值被忽略。(就像if,每個分支能夠成為一個塊,并且它的值是最后塊中表達式的值)</br>
如果沒有其他分支滿足,Else分支被評估。如果when被當做一個表達式使用,else分支是強制性的,除非編譯器能夠證明所有可能的情況被分支條件所覆蓋。</br>
如果更多的分支應該以同一種方式去處理,分支條件可能和逗號結合使用。
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")
}
另一種可能性是檢查值是或者不是一個特定的類型。注意,由于智能轉換,你可以訪問這個類型的方法和屬性而不需要任何其他的檢查
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when也能夠被用于if-else if鏈的替換,如果沒有參數被提供,分置條件是簡單的boolean類型,一個分支被執行當它的條件為true的時候。
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
For Loops
For循環提供一個迭代器遍歷任何東西。語法如下:
for (item in collection) print(item)
語法體可以是一個塊
for (item: Int in ints) {
// ...
}
正如之前提出的,for提供一個迭代器遍歷任何東西,也就是
- 有一個成員或者擴展函數iterator(),它的返回類型
- 有一個成員或者擴展函數 next(), 并且
- 有一個返回boolean類型成員或者擴展函數 hasNext() .
所有的這些函數應該被標記為operator。
一個for循環遍歷一個數組被編譯為不創建迭代器對象而是基于索引的循環。
如果你想遍歷一個數組或者一個列表通過索引,你可以以這種方式:
for (i in array.indices) {
print(array[i])
}
注意 “遍歷一個范圍”被編譯成沒有其他額外的對象被創建最佳的實現。
相反的,你可以使用withIndex庫函數:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
While Loops(While循環)
While和do…while像平常那樣工作
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y is visible here!
Break and continue in loops
Kotlin支持傳統的break和continue操作符在循環中。參看 Returns and jumps