本文收錄于 kotlin入門(mén)潛修專(zhuān)題系列,歡迎學(xué)習(xí)交流狐榔。
創(chuàng)作不易坛增,如有轉(zhuǎn)載,還請(qǐng)備注薄腻。
返回和跳轉(zhuǎn)
kotlin中有三種類(lèi)型的跳轉(zhuǎn)表達(dá)式
— return收捣,即返回語(yǔ)句,默認(rèn)從最近的一個(gè)方法返回被廓,表示該方法執(zhí)行結(jié)束坏晦。
— break,跳出最近的循環(huán)體
— continue嫁乘,跳過(guò)本次執(zhí)行昆婿,繼續(xù)執(zhí)行循環(huán)體的下一次循環(huán)
return、break蜓斧、continue都可以結(jié)合Nothing Type(后面的文章會(huì)講解)使用仓蛆,如下所示:
fun test(i: Int?) {
val j = i?: return//這條語(yǔ)句是合法的,會(huì)判斷i是否為null挎春,如果不為null則返回i的值看疙,否則返回空
println(j)
}
Break和Continue使用
kotlin中break和continue的使用和和其他語(yǔ)言基本一樣豆拨,示例如下:
for (i in 1..10) {
if (i % 2 == 0) break//break的使用,這里遇到第一個(gè)偶數(shù)就是跳轉(zhuǎn)整個(gè)循環(huán)
print(i.toString().plus(" "))//只打印'1'
}
for (i in 1..10) {
if (i % 2 == 0) continue//continue的使用能庆,這里遇到偶數(shù)就終止本次執(zhí)行施禾,然后繼續(xù)循環(huán)體的下次循環(huán)
print(i.toString().plus(" "))//打印'1 3 5 7 9'
}
Break 和 Continue標(biāo)簽
kotlin中的表達(dá)式都可以用label來(lái)進(jìn)行標(biāo)識(shí),這在return搁胆、continue等返回和跳轉(zhuǎn)的時(shí)候很有用處弥搞。label的語(yǔ)法格式為:
@ sign expression//@符號(hào)是必須的,sign是該label的名稱(chēng)渠旁,一般的字符串命名都可以攀例,注意有些是不能用于label命名的,如kotlin中的關(guān)鍵字等顾腊。expression是任意表達(dá)式
label定義的具體示例如下:
myfor@ for (i in 1..10) {//for 表達(dá)式
println("myfor loop: ".plus(i))//打印 '1'
for (j in 1..10){
if (j == i + 5) break@myfor//注意break@myfor中間不能有空格粤铭,是一個(gè)整體
println(i.toString().plus(":").plus(j))//打印'1:1 1:2 1:3 1:4 1:5'
}
}
上面示例中展示了標(biāo)簽的使用,myfor為標(biāo)簽的名稱(chēng)杂靶,@是必須的語(yǔ)法標(biāo)識(shí)梆惯,而expression即是后面的for循環(huán)。第二層for循環(huán)中做了條件判斷吗垮,即j == i + 5的時(shí)候加袋,break到了myfor標(biāo)簽,也即是最外層的for循環(huán)抱既,顯然當(dāng)i=1時(shí),j = 6的時(shí)候就會(huì)觸發(fā)該條件扁誓,進(jìn)而跳出myfor循環(huán)體防泵。故外層for循環(huán)(即myfor標(biāo)簽循環(huán))打印了1次,內(nèi)層打印了5次蝗敢。
標(biāo)簽在return中的應(yīng)用
kotlin中捷泞,return默認(rèn)會(huì)返回至調(diào)用該方法的地方,如下所示:
@JvmStatic fun main(args: Array<String>) {//和java的main方法入口一樣寿谴,@JvmStatic用于標(biāo)識(shí)該方法是jvm static方法锁右。后面會(huì)介紹。
test()//這里是test方法的調(diào)用處
}
fun test() {
arrayOf(1,2,3).forEach {
if (it == 2) return//注意這里讶泰,將會(huì)返回到test方法的調(diào)用處咏瑟,即main調(diào)用test的地方
println(it)//打印'1',因?yàn)楫?dāng)it == 2的時(shí)候return了痪署,即改方法執(zhí)行結(jié)束
}
}
由上面代碼可知码泞,return默認(rèn)返回該方法的調(diào)用處,如果只想從lambda表達(dá)式中返回狼犯,就用到了標(biāo)簽的功能
@JvmStatic fun main(args: Array<String>) {
test()
}
fun test() {
arrayOf(1,2,3).forEach myForEach@ {//這里采用了label
if (it == 2) return@myForEach
println(it)//打印 '1 3'
}
}
上面代碼打印出了1 余寥、3领铐。因?yàn)楫?dāng)it == 2的時(shí)候return到了指定的label即forEach調(diào)用處,然后從該代碼處再接著執(zhí)行
就打印出了1宋舷、3绪撵。
有同學(xué)可能發(fā)現(xiàn)上面寫(xiě)法過(guò)于麻煩,確實(shí)這樣祝蝠,實(shí)際上kotlin提供了一個(gè)隱式的標(biāo)簽音诈,即不用再顯示定義label。而采用默認(rèn)的label续膳,這個(gè)默認(rèn)的label就是方法名改艇。下面的寫(xiě)法和上面代碼功能相同
@JvmStatic fun main(args: Array<String>) {
test()
}
fun test() {
arrayOf(1,2,3).forEach{
if (it == 2) return@forEach//注意這里,返回了隱式的標(biāo)簽坟岔,即forEach調(diào)用處
println(it)
}
}
當(dāng)然在kotlin中還可以使用匿名方法達(dá)到上面的效果谒兄,如下所示:
@JvmStatic fun main(args: Array<String>) {
test()
}
fun test() {
arrayOf(1, 2, 3).forEach(fun(value: Int) {//這里采用了匿名方法,效果和上述代碼一樣
if (value == 3) return
println(value)
})
}
最后要說(shuō)明的是社付,continue承疲、break無(wú)法和return一樣采用上述寫(xiě)法,continue和break只能用于循環(huán)體當(dāng)中鸥咖。實(shí)際上上述代碼中return已經(jīng)展示了和continue一樣的功能燕鸽。但沒(méi)有表達(dá)出break的功能,實(shí)際上如果要利用label來(lái)表達(dá)break功能也是可以的啼辣,示例代碼如下:
@JvmStatic fun main(args: Array<String>) {
test()
}
fun test() {
run {
arrayOf(1, 2, 3).forEach {
if (it == 2) return@run//注意這里啊研,返回了run執(zhí)行處
println(it)//打印 '1'
}
}
}
上面代碼只會(huì)打印1,因?yàn)閕t == 2的時(shí)候return到了run調(diào)用處鸥拧,標(biāo)志著run執(zhí)行結(jié)束党远。
最后,我們還可以return一個(gè)常量到指定的label調(diào)用處富弦,作為執(zhí)行結(jié)果沟娱,示例如下:
fun test() {
val result = run {
arrayOf(1, 2, 3).forEach {
if (it == 2) return@run "over"http://注意這里在label后面跟了一個(gè)常量
}
}
print(result)//打印 'over'
}