前面其實我們在一些Demo中已經(jīng)接觸到了循環(huán)的一些用法。
For 循環(huán)
for 循環(huán)可以對任何提供迭代器(iterator)的對象進(jìn)行遍歷障贸,如:
for (item: Int in ints) {
// ……
}
或:
for (item in collection) print(item)
也可以遍歷集合的下標(biāo)
fun forMethod(args: ArrayList<String>){
for (i in args.indices){
print(i)
}
}
還可以寫成這樣:
for ((key,value) in args.withIndex()){
print("the element at $key is $value")
}
while 與 do...while 循環(huán)
while循環(huán)與在Java中的語法幾乎沒啥區(qū)別:
while( 布爾表達(dá)式 ) {
//循環(huán)內(nèi)容
}
do...while 也一樣曹阔,對于while語句而言嗡髓,如果不滿足條件妹卿,則不能進(jìn)入循環(huán)。但有時候我們需要即使不滿足條件渣玲,也至少執(zhí)行一次。
do…while 循環(huán)和 while 循環(huán)相似弟晚,不同的是忘衍,do…while 循環(huán)至少會執(zhí)行一次。
do {
//代碼語句
}while(布爾表達(dá)式);
實例
fun main(args: Array<String>) {
println("----while 使用-----")
var x = 5
while (x > 0) {
println( x--)
}
println("----do...while 使用-----")
var y = 5
do {
println(y--)
} while(y>0)
}
返回和跳轉(zhuǎn)
Kotlin 有三種結(jié)構(gòu)化跳轉(zhuǎn)表達(dá)式:
- return卿城。默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回枚钓。
- break。終止最直接包圍它的循環(huán)瑟押。
- continue搀捷。繼續(xù)下一次最直接包圍它的循環(huán)。
Break 和 Continue 標(biāo)簽
在 Kotlin 中任何表達(dá)式都可以用標(biāo)簽(label)來標(biāo)記。 標(biāo)簽的格式為標(biāo)識符后跟@ 符號嫩舟,例如:abc@氢烘、fooBar@都是有效的標(biāo)簽。 要為一個表達(dá)式加標(biāo)簽家厌,我們只要在其前加標(biāo)簽即可播玖。
loop@ for (i in 1..100) {
// ……
}
現(xiàn)在,我們可以用標(biāo)簽限制 break 或者continue:
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
標(biāo)簽限制的 break 跳轉(zhuǎn)到剛好位于該標(biāo)簽指定的循環(huán)后面的執(zhí)行點饭于。 continue 繼續(xù)標(biāo)簽指定的循環(huán)的下一次迭代蜀踏。
下面是一個實例,可以幫助你更好的理角label在循環(huán)中的應(yīng)用
fun labelTest() {
loop@ for (i in 1..5) {
Log.e("LabelTest","print i = $i before")
for (j in 1..5) {
if (j % i != 0) {
Log.e("LabelTest"," break to loop at i =$i, j =$j")
break@loop
}
if (j % 2 == 0) {
Log.e("LabelTest"," continue to loop at i =$i, j =$j")
continue@loop
}
Log.e("LabelTest"," run at i = $i,j=$j")
}
Log.e("LabelTest","print i = $i after")
}
}
將外層循環(huán)命名為loop之后掰吕,內(nèi)層循環(huán)出現(xiàn)j不能整除i的情況果覆,就在loop指定的循環(huán)中跳出。
相當(dāng)于在外層循環(huán)調(diào)用break.而下面的j為偶數(shù)時殖熟,則相當(dāng)于在外層循環(huán)中調(diào)用continue.下面是輸出結(jié)果:
print i = 1 before
run at i = 1,j=1
continue to loop at i =1, j =2
print i = 2 before
break to loop at i =2, j =1
標(biāo)簽處返回
Kotlin 有函數(shù)字面量局待、局部函數(shù)和對象表達(dá)式。因此 Kotlin 的函數(shù)可以被嵌套吗讶。 標(biāo)簽限制的 return 允許我們從外層函數(shù)返回燎猛。 最重要的一個用途就是從 lambda 表達(dá)式中返回。
fun labelReturn() {
val array = Array(5, { index -> index + 1 })
array.forEach {
if(it==4){
return
}
Log.e(TAG, " index = $it")
}
Log.e(TAG, "print after foreach")
}
這個 return 表達(dá)式從最直接包圍它的函數(shù)即 labelReturn 中返回照皆。輸出結(jié)果為:
index = 1
index = 2
index = 3
如果我們需要從 lambda 表達(dá)式中返回重绷,我們必須給它加標(biāo)簽并用以限制 return。
修改成如下:
fun labelReturn() {
val array = Array(5, { index -> index + 1 })
array.forEach loop@ {
if(it==4){
return@loop
}
Log.e(TAG, " index = $it")
}
Log.e(TAG, "print after foreach")
}
輸出結(jié)果如下:
index = 1
index = 2
index = 3
index = 5
print after foreach
不難看出當(dāng)下標(biāo)為4時膜毁,將loop標(biāo)記的整個代碼塊作為了返回值從lambda表達(dá)式中返回昭卓。但并沒有終止整個labelReturn函數(shù)。
通常情況下使用隱式標(biāo)簽更方便瘟滨。 該標(biāo)簽與接受該 lambda 的函數(shù)同名候醒,所以上面的代碼可以改寫為:
fun labelReturn() {
val array = Array(5, { index -> index + 1 })
array.forEach {
if(it==4){
return@forEach
}
Log.e(TAG, " index = $it")
}
Log.e(TAG, "print after foreach")
}
輸出結(jié)果完全相同。
當(dāng)要返一個回值的時候杂瘸,解析器優(yōu)先選用標(biāo)簽限制的 return倒淫,即
return@block 1
意為"從標(biāo)簽 @block 返回 1",而不是"返回一個標(biāo)簽標(biāo)注的表達(dá)式 (@block 1)"败玉。