Kotlin 循環(huán)控制

前面其實我們在一些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)"败玉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敌土,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子运翼,更是在濱河造成了極大的恐慌返干,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件血淌,死亡現(xiàn)場離奇詭異矩欠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門癌淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺坟,“玉大人,你說我怎么就攤上這事该默⊥ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵栓袖,是天一觀的道長匣摘。 經(jīng)常有香客問我,道長裹刮,這世上最難降的妖魔是什么音榜? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捧弃,結(jié)果婚禮上赠叼,老公的妹妹穿的比我還像新娘。我一直安慰自己违霞,他們只是感情好嘴办,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著买鸽,像睡著了一般涧郊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼五,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天妆艘,我揣著相機(jī)與錄音,去河邊找鬼看幼。 笑死批旺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诵姜。 我是一名探鬼主播汽煮,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棚唆!你這毒婦竟也來了暇赤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瑟俭,失蹤者是張志新(化名)和其女友劉穎翎卓,沒想到半個月后契邀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摆寄,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了微饥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗扒。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖欠橘,靈堂內(nèi)的尸體忽然破棺而出矩肩,到底是詐尸還是另有隱情,我是刑警寧澤肃续,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布黍檩,位于F島的核電站,受9級特大地震影響始锚,放射性物質(zhì)發(fā)生泄漏刽酱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一瞧捌、第九天 我趴在偏房一處隱蔽的房頂上張望棵里。 院中可真熱鬧,春花似錦姐呐、人聲如沸殿怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽头谜。三九已至,卻和暖如春麦轰,著一層夾襖步出監(jiān)牢的瞬間乔夯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工款侵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留末荐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓新锈,卻偏偏與公主長得像甲脏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妹笆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多块请,快來 Kotlin ,快速學(xué)習(xí)Kotlin拳缠! 什么是Kotlin墩新? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,215評論 9 118
  • 第2章 Kotlin 語法基礎(chǔ) 人與人之間通過語言來交流溝通,互相協(xié)作窟坐。人與計算機(jī)之間怎樣“交流溝通”呢海渊?答案是編...
    光劍書架上的書閱讀 1,619評論 0 6
  • 不重要的廢話 前段時間看了一遍《Programming Kotlin》绵疲,主要目的是想提高自己的英文閱讀能力,能力提...
    珞澤珈群閱讀 3,362評論 1 7
  • 警徽閃耀 演唱:望海高歌 詞作:盧木鳥 作曲:石 塵 編曲:望海高歌 寒來暑往一年又一年 風(fēng)里雨里總將你看見 警徽...
    華狐發(fā)布閱讀 965評論 0 0
  • 一臣疑、客戶接觸流程 1盔憨、客戶信息收集 客戶信息的收集是與客戶接觸的前提,因而平時業(yè)務(wù)員最主要的工作之一就是收集客戶信...
    hello貢閱讀 408評論 0 0