kotlin入門(mén)潛修之基礎(chǔ)篇—返回和跳轉(zhuǎn)

本文收錄于 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'
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腕柜,隨后出現(xiàn)的幾起案子济似,更是在濱河造成了極大的恐慌,老刑警劉巖盏缤,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰蠢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛾找,警方通過(guò)查閱死者的電腦和手機(jī)娩脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)打毛,“玉大人柿赊,你說(shuō)我怎么就攤上這事俩功。” “怎么了碰声?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诡蜓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我胰挑,道長(zhǎng)蔓罚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任瞻颂,我火速辦了婚禮豺谈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贡这。我一直安慰自己茬末,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盖矫。 她就那樣靜靜地躺著丽惭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辈双。 梳的紋絲不亂的頭發(fā)上责掏,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音湃望,去河邊找鬼换衬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛证芭,可吹牛的內(nèi)容都是我干的冗疮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼檩帐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了另萤?” 一聲冷哼從身側(cè)響起湃密,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎四敞,沒(méi)想到半個(gè)月后泛源,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忿危,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年达箍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铺厨。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缎玫,死狀恐怖硬纤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赃磨,我是刑警寧澤筝家,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站邻辉,受9級(jí)特大地震影響溪王,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜值骇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一莹菱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吱瘩,春花似錦道伟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至部逮,卻和暖如春娜汁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兄朋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工掐禁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颅和。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓傅事,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親峡扩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹭越,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359