本文收錄于 kotlin入門潛修專題系列惯吕,歡迎學(xué)習(xí)交流惕它。
創(chuàng)作不易,如有轉(zhuǎn)載废登,還請備注淹魄。
控制表達(dá)式
kotlin中控制表達(dá)式主要有四個:if、when堡距、for甲锡、while 。本篇文章將探討這四種表達(dá)式如何使用以及使用場景是什么羽戒。
if 表達(dá)式
在kotlin中缤沦,if不僅可以作為條件判斷語句,而且還可以作為一個表達(dá)式易稠,當(dāng)作為表達(dá)式出現(xiàn)的時(shí)候是有返回值的缸废。因此kotlin不再提供三元表達(dá)式(即condition? then:else),if-else已經(jīng)足夠表達(dá)上述情景。
if表達(dá)式使用示例如下:
var min = 0
var a = -1
if (a < min) min = a//if 條件判斷
var b = -2
if (a < b) {//if else一起使用
min = a
} else {
min = b
}
min = if (a < b) a else b//作為表達(dá)式使用
println(min)//打印 '-2'
kotlin中if表達(dá)式可以是一個塊企量,塊的最后一個表達(dá)式作為返回值测萎,如下所示:
var min = 0
val a = -1
val b = -2
min = if (a < b) {//if塊,注意這里需要提供返回值并賦值于min變量
println("a < b")//可以執(zhí)行語句
a//最后一個表達(dá)式作為返回值
} else {//同if
println("a > b")
b
}
println(min)
注意届巩,當(dāng)if作為表達(dá)式的時(shí)候硅瞧,必須要跟else分支。
When表達(dá)式
對于類c語言恕汇,大家都很熟悉switch表達(dá)式腕唧,然而在kotlin中不再有這個表達(dá)式,取而代之的是就是when表達(dá)式瘾英。
val a = -1
when (a) {
1 -> println("a == 1")//注意枣接,這即表示一個匹配條件,類似于switch中的case
-1 -> println("a == -1")
0 -> println("a == 0")
else -> {//類似于switch中的default
print("a not match...")
}
}
when表達(dá)式會依次檢測每個條件語句方咆,直到匹配了某個條件即終止檢測月腋。如果所有條件都不匹配則進(jìn)入else分支。
此外瓣赂,當(dāng)when單純作為語句出現(xiàn)時(shí),else分支是可以省略的片拍,但是當(dāng)作為表達(dá)式出現(xiàn)時(shí)則必須要有else分支煌集,除非編譯器能夠確認(rèn)when中的分支能夠cover所有的場景,比如when表達(dá)式處理的是枚舉類或者sealed類捌省。具體示例如下:
val a = -1
val b = when (a) {//when作為表達(dá)式存在苫纤,需要返回值,并賦值于b
1 -> println("a == 1")
-1 -> println("a == -1")
0 -> println("a == 0")
else -> {//注意纲缓,這個else此時(shí)必須存在卷拘,否則編譯器會報(bào)錯
print("a not match...")
}
}
對于條件不同,而處理結(jié)果相同的情形祝高,when可以用"栗弟,"進(jìn)行條件分割,如下所示
val a = -1
when (a) {
0, 1 -> println("a != 0 且 a != 0")//用逗號,合并不同case
-1 -> println("a == -1")
}
kotlin中的when非常強(qiáng)大,它可以支持任意表達(dá)式(而不局限于常量)作為判斷條件工闺,如下所示:
val a = -1
val b = 2
when (a) {
in -2..10 -> println("a在-2-10區(qū)間內(nèi)")//支持任意表達(dá)式
b.toInt() -> println("a == b == 2")
}
when的另一個用途可以用作類型檢測乍赫,如下所示:
fun isInt(a:Any) = when (a) {
is Int -> println("a是個整數(shù)")//這里利用is關(guān)鍵字進(jìn)行類型判斷
else -> println("a不是個整數(shù)")
}
isInt(2)//打印 'a是個整數(shù)'
when同時(shí)可以作為if-else 的替代方案,如下所示:
val x = 1
when {//when塊執(zhí)行后陆蟆,會打印'x>0'
x > 0 -> print("x > 0")
x < 0 -> print("x < 0")
else -> print("x == 0")
}
上面這種替代方案雷厂,并沒有指定條件(即when沒有接收入?yún)ⅲ藭r(shí)會默認(rèn)根據(jù)每個語句的true和false來進(jìn)行匹配叠殷,如果某個語句返回了true則終止檢測改鲫。
For循環(huán)
kotlin中的for循環(huán)可以遍歷一切提供有迭代器的對象集合,其使用語法如下:
val ints: Array<Int> = arrayOf(1, 2, 3)
for (item in ints) {
println(item)//打印'1 2 3'
}
for循環(huán)同時(shí)可以迭代一段指定范圍的數(shù)字,如下所示:
for (item in 1..3) {//range for循環(huán)
println(item)//打印' 1 2 3'
}
for (item in 10 downTo 0 step 2){
println(item)//'打印 10 8 6 4 2 0'
}
由上述代碼可知像棘,kotlin的for循環(huán)十分強(qiáng)大纫塌,支持的操作符即豐富有語義化。比如downTo(即遞減到某個值)讲弄、step(步長措左,每次迭代的步長值)等。
對于遍歷數(shù)組或者一段范圍的數(shù)字避除,for循環(huán)并不會生成迭代對象怎披,而是會被編譯器編譯為基于索引的for循環(huán)。如果數(shù)組或者集合想直接通過索引進(jìn)行遍歷瓶摆,也可以通過以下方法進(jìn)行:
val ints: Array<Int> = arrayOf(1, 2, 3)
for (index in ints.indices){//第一種方法凉逛,首先獲取索引,然后根據(jù)索引取值
println(ints[index])
}
for ((index, value) in ints.withIndex()){//第二種方法群井,直接可以獲取索引以及其對應(yīng)的值
println("the element at $index is $value")
}
While循環(huán)
kotlin中的while循環(huán)和java基本一致状飞,示例如下:
var k = 10
while (k > 0){//while循環(huán)
k--
}
do {//do-while循環(huán)
k++
}while (k < 10)
while循環(huán)和其他語言相差不大,也比較簡單书斜,這里不再闡述诬辈。