歡迎關(guān)注 二師兄Kotlin
轉(zhuǎn)載請(qǐng)注明出處 二師兄kotlin
流程控制
If表達(dá)式
在Kotlin中,if是表達(dá)式,它可以有返回值窄刘。所以三元表達(dá)式(? :)就沒有存在的必要了局扶,if替代了它的角色。
// 傳統(tǒng)用法
var max = a
if (a < b)
max = b
// 帶上else
var max: Int
if (a > b)
max = a
else
max = b
// 用作表達(dá)式
val max = if (a > b) a else b
if的條件分支可以是代碼塊纷纫,塊中最后一條語(yǔ)句就是它的返回值:
val max = if (a > b) {
print("Choose a")
a
}
else {
print("Choose b")
b
}
如果把if當(dāng)作表達(dá)式使用(例如把它的返回值賦給一個(gè)變量)蜈出,else分支是必須的。
詳情請(qǐng)查看if語(yǔ)法涛酗。
When表達(dá)式
when替代了類C語(yǔ)言中的switch操作符铡原,一個(gè)最簡(jiǎn)單寫法如下:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
when按順序把參數(shù)和每一個(gè)分支匹配直達(dá)找到滿足條件的分支。when既可以用作表達(dá)式又可以用作分支語(yǔ)句商叹。如果被用作表達(dá)式燕刻,匹配的分支就是整個(gè)表達(dá)式的返回值。如果用作分支語(yǔ)句剖笙,每個(gè)分支的執(zhí)行結(jié)果將被忽略卵洗。(和if一樣,每個(gè)分支也可以是語(yǔ)句塊弥咪,最后一條語(yǔ)句的執(zhí)行結(jié)果就是語(yǔ)句塊的返回值)
如果沒有匹配的分支过蹂,else分支會(huì)默認(rèn)執(zhí)行。如果when被用作表達(dá)式聚至,else分支是必須的酷勺,除非編譯器可以保證所有條件分支都已被考慮到。
如果多條分支有相同的處理邏輯扳躬,它們可以按照下面這種方式合并到一起:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
除了常量外脆诉,我們還可以使用任意表達(dá)式作為分支條件:
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
也可以用in
或者!in
來檢查一個(gè)值是否在一個(gè)rang
或一個(gè)集合內(nèi):
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
判斷一個(gè)值是不是屬于某個(gè)的類型。這里要注意贷币,由于有smart cast,你不需要額外檢查就可以直接訪問這個(gè)類型的屬性和方法击胜。
val hasPrefix = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when也可以代替if-else-if
鏈。如果沒有提供參數(shù)役纹,分支條件就僅僅是布爾表達(dá)式偶摔,對(duì)應(yīng)分支也只會(huì)在true的情況下才被執(zhí)行:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
詳情請(qǐng)看when的語(yǔ)法
For循環(huán)
for循環(huán)可以遍歷任何提供了迭代器的東西。語(yǔ)法如下:
for (item in collection)
print(item)
循環(huán)體也可以是語(yǔ)句塊:
for (item: Int in ints) {
// ...
}
上文提到的促脉,for可以遍歷任何提供了迭代器的東西辰斋,例如:
有一個(gè)成員或者擴(kuò)展函數(shù)iterator()
信不,它的返回類型
- 包含一個(gè)成員或擴(kuò)展函數(shù)
next()
,且 - 包含一個(gè)成員或者擴(kuò)展函數(shù)
hasNext()
亡呵,它的返回值是Boolean
以上三個(gè)函數(shù)都必須被標(biāo)記為操作符(operator)
抽活。
for循環(huán)用在數(shù)組上會(huì)被編譯為一個(gè)基于索引的循環(huán),并不會(huì)創(chuàng)建一個(gè)迭代器锰什。
如果你想通過索引遍歷數(shù)組或list下硕,你可以這么做:
for (i in array.indices)
print(array[i])
請(qǐng)注意,類似這樣對(duì)range的遍歷會(huì)被編譯器優(yōu)化汁胆,不會(huì)創(chuàng)建任何額外的對(duì)象梭姓。
另外,你可以使用庫(kù)函數(shù)withIndex
:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
詳情請(qǐng)看for語(yǔ)法嫩码。
While循環(huán)
while和do...while跟其他語(yǔ)言沒什么兩樣:
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // 此處y是可見的!
詳情請(qǐng)看while語(yǔ)法誉尖。
Break和Continue
Kotlin支持在循環(huán)中使用傳統(tǒng)意義上的Break和Continue。詳情查看Returns and jumps铸题。
與Java相比铡恕,Kotlin流程控制簡(jiǎn)單總結(jié)為:
1. while還是那個(gè)while
2. when取代了switch
3. if兼職了表達(dá)式