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
如果分支是代碼塊书蚪,則以最后一個表達式作為該代碼塊的值:
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
如果您正在使用if作為表達式而不是語句(即返回其值或將其分配給某個變量)喇澡,則表達式需要具有其他分支。
when表達式
when表達式用于替換像C語言中的switch語句殊校,最簡單的形式如下:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
when將它的參數(shù)與所有的分支順序匹配晴玖,直到滿足某一些分支條件。 when也可以用作表達式或作為語句为流。 如果將其用作表達式呕屎,則滿足分支的值將變?yōu)檎w表達式的值。 如果將其用作語句艺谆,被匹配分支的值將被忽略。(就像if拜英,每個分支可以是一個塊静汤,其值是塊中最后一個表達式的值。)
如果不匹配其他分支條件居凶,則執(zhí)行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來檢查一個值是否屬于指定類型替饿。 請注意语泽,由于is判斷成功后的智能轉換,可以直接訪問目標類型的方法和屬性视卢,而無需任何額外檢查:
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when也可以用來替代if-else-if鏈踱卵。 如果沒有為when關鍵字提供參數(shù),則分支條件是簡單的布爾表達式据过,當條件為真時執(zhí)行分支:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
for循環(huán)
凡是可以提供迭代器的類型或對象惋砂,for語句都可以對其遍歷。 語法如下:
for (item in collection) print(item)
執(zhí)行體也可以是語句塊:
for (item: Int in ints) {
// ...
}
如前所述绳锅,for語句可以迭代任何可以提供迭代器的內容西饵,如:
- has a member- or extension-function iterator(), whose return type
- has a member- or extension-function next(), and
- has a member- or extension-function hasNext() that returns Boolean.
所有這三個函數(shù)都需要被標記為operator
。
使用for語句來循環(huán)數(shù)組的時候鳞芙,被編譯為一個基于索引的循環(huán)罗标,它不會創(chuàng)建一個迭代器對象庸队。
如果要遍歷具有索引的數(shù)組或列表,可以這樣做:
for (i in array.indices) {
print(array[i])
}
注意:這個“通過范圍的迭代”被編譯成最佳實現(xiàn)闯割,沒有創(chuàng)建額外的對象彻消。
除此之外,也可以使用withIndex庫函數(shù)宙拉,如下所示:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
while循環(huán)
while循環(huán)和do...while循環(huán)和平常使用的方法一樣:
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y is visible here!
循環(huán)中的break和continue
Kotlin在循環(huán)操作中支持傳統(tǒng)的break和continue關鍵字宾尚。