Kotlin學習筆記(4)- 流程控制

系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正凭迹。如果你覺得我的文章對你有用,歡迎關(guān)注我苦囱,我們一起學習進步嗅绸!
Kotlin學習筆記(1)- 環(huán)境配置
Kotlin學習筆記(2)- 空安全
Kotlin學習筆記(3)- 語法
Kotlin學習筆記(4)- 流程控制
Kotlin學習筆記(5)- 類
Kotlin學習筆記(6)- 屬性
Kotlin學習筆記(7)- 接口
Kotlin學習筆記(8)- 擴展
Kotlin學習筆記(8)- 擴展(續(xù))
Kotlin學習筆記(9)- 數(shù)據(jù)類
Kotlin學習筆記(10)- 泛型
Kotlin學習筆記(11)- 內(nèi)部類和嵌套類
Kotlin學習筆記(12)- 委托
Kotlin學習筆記(13)- 函數(shù)式編程
Kotlin學習筆記(14)- lambda

本文將的是Kotlin的流程控制語句,眾所周知撕彤,流程控制是幾乎所有變成的核心之一鱼鸠。Kotlin的流程控制在java的基礎(chǔ)上做了優(yōu)化,其中很大的一部分就是流程控制表達式可為變量直接賦值羹铅,這在java中蚀狰,幾乎只有三木運算一種實現(xiàn)方式。Kotlin的這一特點职员,大大提高了我們的效率麻蹋。

本文中的一些內(nèi)容和我上一篇的《Kotlin學習筆記(3)- 語法》有些重復,但是既然要講流程焊切,我覺得這些是一定要講的扮授,而且還會有一些拓展。

一专肪、if 表達式

  1. 普通用法

    var a = 3
    var b = 5
    var max : Int
    // 普通用法
    if(a > b)
        max = a
    else
        max = b
    log("普通 max : $max")   // 普通 max : 5
    
  2. 作為表達式糙箍,可以直接賦值給變量,其值為為true的分支的值

    // 作為表達式
    max = if(a>b) a else b
    log("表達式 max : $max")  // 表達式 max : 5
    
  3. 分支的內(nèi)容除了是簡單的結(jié)果牵祟,也可以是代碼塊深夯。值為true的分支的最后一行為結(jié)果

    // 分支內(nèi)容為代碼塊
    max = if(a>b){
        log("代碼塊 a>b")     
        a
    }else{
        log("代碼塊 a<=b")    // 代碼塊 a<=b
        b
    }
    log("代碼塊 max : $max")   // 代碼塊 max : 5
    

二、when 表達式

kotlin中的when類似于java中switch,用于多條件分支比對咕晋,和if一樣的雹拄,when除了被用作語句這種普通用法外,也可作為表達式掌呜。還有一點和switch不同的是滓玖,kotlin用else代替了default,感覺上把其他分支的優(yōu)先級提前了质蕉,更加接近于多if...else if势篡,意思更加明確。

  1. 普通用法

    var a = 3
    var strA = "3"
    var out : String
    // 普通用法
    when (a) {
        1       -> log("普通 a :$a")
        2       -> log("普通 a :$a")
        3       -> log("普通 a :$a")      // 普通 a :3
        else    -> log("普通 a :error")
    }
    
  2. 作為表達式模暗,可以將結(jié)果賦值給變量禁悠,結(jié)果為符合條件的分支的值

    out = when(a){
        1       -> "表達式 a :$a"
        2       -> "表達式 a :$a"
        3       -> "表達式 a :$a"
        else    -> "表達式 a :error"
    }
    log(out)  // 表達式 a :3
    
  3. if類似,分支的內(nèi)容除了是簡單的結(jié)果兑宇,也可以是代碼塊碍侦。值為符合條件的分支的最后一行為結(jié)果

    out = when(a){
        3 -> {
            log("代碼塊 a :$a")  // 代碼塊 a :3
            "代碼塊 a :$a"
        }
        else -> {
            log("代碼塊 a :error")
            "代碼塊 a :error"
        }
    }
    log(out)  // 代碼塊 a :3
    
  4. 分支的條件也不僅限于常量,也可以是表達式

    out = when(a){
        parseInt(strA) -> "strA = a"
        else    -> "表達式 parseInt :error"
    }
    log(out)  // strA = a
    
    fun parseInt(str : String) = str.toInt()
    
  5. 如果多個分支的結(jié)果相同隶糕,或者有同樣的操作瓷产,則可以將這些分支條件合并,之間用,分割

    out = when(a){
        1,2,3       -> "表達式 a :$a"
        else    -> "表達式 a :error"
    }
    log(out)  // 表達式 a :3
    
  6. in 表示范圍區(qū)間

    out = when(a){
        in 1..5 -> "$a is in 1..5"
        else -> "out of range"
    }
    log(out)  // 3 is in 1..5
    
  7. is 表示檢查一個值

    out = when(a){
        is Int -> "a is a Int"
        else -> "other type"
    }
    log(out)  // a is a Int
    
  8. when可以不檢驗任何參數(shù)枚驻,所有的分支都是Boolean濒旦,這時候如果一個分支的條件為true時,則調(diào)用該分支

    when{
        a is Int -> log("a is Int")  // // a is Int
        else -> log("unknow type")
    }
    
  9. 如果有多個條件同時滿足再登,則調(diào)用第一個滿足條件的分支

    out = when(a){
        in 1..5 -> "$a is in 1..5"
        parseInt(strA) -> "strA = a"
        else -> "other case"
    }
    log(out) // 3 is in 1..5
    

三疤估、循環(huán)

  1. for循環(huán),可以對任何提供迭代器(iterator)的集合進行遍歷

  2. while循環(huán)霎冯,使用方式和其他語言類似,有whiledo...while兩種

    具體使用方式可以看我上一篇文章《Kotlin學習筆記(3)- 語法》中的“九钞瀑、循環(huán)”部分

四沈撞、返回和跳轉(zhuǎn)

  1. 和java一樣,kotlin中的返回和跳轉(zhuǎn)有三種方式雕什。

    • return: 從最近的一個封閉的方法或者方法表達式跳出.
    • break: 終止最近的封閉循環(huán)
    • continue: 直接進入循環(huán)體的下次循環(huán)
  2. 除了上面三種常規(guī)的返回跳轉(zhuǎn)方式外缠俺,kotlin還啟用了一種特殊的用法:使用標識符@定義label,一般用在多層循環(huán)的內(nèi)層向外層跳轉(zhuǎn)贷岸。其中壹士,breaklabel結(jié)合,表示跳出指定循環(huán)層偿警。下面的break@label1就表示跳出lebel1的指定的第一層循環(huán)躏救,繼續(xù)執(zhí)行log(result)

    var list = arrayOf(1, 2, 3)
    var child = arrayOf("a", "b", "c")
    var result = ""
    label1@ for(num in list){           // --> 第一層循環(huán)
        result += "($num)"
        for(word in child){             // --> 第二層循環(huán)
            if(word.equals("b"))
                break@label1         // --> break + label
           result += word
        }
    }
    log(result)  // 輸出 (1)a
    

    continuelabel結(jié)合,表示跳轉(zhuǎn)到指定循環(huán)層,繼續(xù)下一次循環(huán)盒使。下面的continue@label2表示跳到第一層循環(huán)崩掘,繼續(xù)下一次循環(huán)。見輸出結(jié)果可知少办,在wordb時苞慢,跳出了當前的第二層循環(huán),跳到第一層繼續(xù)循環(huán)

    label2@ for(num in list){           // --> 第一層循環(huán)
        result += "($num)"
        for(word in child){             // --> 第二層循環(huán)
            if(word.equals("b"))
                continue@label2         // --> continue + label
            result += word
        }
    }
    log(result)  // 輸出 (1)a(2)a(3)a
    

最后

本文肯定有很多地方?jīng)]有寫到英妓,淺陋之處挽放,請多包涵。

參考:https://github.com/kymjs/KotlinDoc-cn/blob/master/unit2/ReturnsJumps.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓纠,一起剝皮案震驚了整個濱河市辑畦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贺纲,老刑警劉巖航闺,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猴誊,居然都是意外死亡潦刃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門懈叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乖杠,“玉大人,你說我怎么就攤上這事澄成‰嗜鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵墨状,是天一觀的道長卫漫。 經(jīng)常有香客問我,道長肾砂,這世上最難降的妖魔是什么列赎? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮镐确,結(jié)果婚禮上包吝,老公的妹妹穿的比我還像新娘。我一直安慰自己源葫,他們只是感情好诗越,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著息堂,像睡著了一般嚷狞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天感耙,我揣著相機與錄音褂乍,去河邊找鬼。 笑死即硼,一個胖子當著我的面吹牛逃片,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只酥,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼褥实,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裂允?” 一聲冷哼從身側(cè)響起损离,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝编,沒想到半個月后僻澎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡十饥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年窟勃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗堵。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡秉氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜒秤,到底是詐尸還是另有隱情汁咏,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布作媚,位于F島的核電站攘滩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纸泡。R本人自食惡果不足惜漂问,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弟灼。 院中可真熱鬧,春花似錦冒黑、人聲如沸田绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掩驱。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欧穴,已是汗流浹背民逼。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涮帘,地道東北人拼苍。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像调缨,于是被迫代替她去往敵國和親疮鲫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 前言 人生苦多弦叶,快來 Kotlin 俊犯,快速學習Kotlin! 什么是Kotlin伤哺? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,146評論 9 118
  • Kotlin系統(tǒng)化學習-20170823文章中有大部分內(nèi)容是借鑒《Kotlin實戰(zhàn)》中文版燕侠,特此注明一下。 Kot...
    ClAndEllen閱讀 1,655評論 2 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理立莉,服務發(fā)現(xiàn)绢彤,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 《Kotin 編程思想·實戰(zhàn)》 《Kotlin極簡教程》正式上架: 點擊這里 > 去京東商城購買閱讀 點擊這里 >...
    光劍書架上的書閱讀 2,061評論 1 4
  • 是非無法斷桃序, 惟靠主耶穌杖虾。 教誨須遵守, 罪愆皆馴服媒熊。
    海王星1984閱讀 128評論 0 0