系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正凭迹。如果你覺得我的文章對你有用,歡迎關(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 表達式
-
普通用法
var a = 3 var b = 5 var max : Int // 普通用法 if(a > b) max = a else max = b log("普通 max : $max") // 普通 max : 5
-
作為表達式糙箍,可以直接賦值給變量,其值為為true的分支的值
// 作為表達式 max = if(a>b) a else b log("表達式 max : $max") // 表達式 max : 5
-
分支的內(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
势篡,意思更加明確。
-
普通用法
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") }
-
作為表達式模暗,可以將結(jié)果賦值給變量禁悠,結(jié)果為符合條件的分支的值
out = when(a){ 1 -> "表達式 a :$a" 2 -> "表達式 a :$a" 3 -> "表達式 a :$a" else -> "表達式 a :error" } log(out) // 表達式 a :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
-
分支的條件也不僅限于常量,也可以是表達式
out = when(a){ parseInt(strA) -> "strA = a" else -> "表達式 parseInt :error" } log(out) // strA = a fun parseInt(str : String) = str.toInt()
-
如果多個分支的結(jié)果相同隶糕,或者有同樣的操作瓷产,則可以將這些分支條件合并,之間用,分割
out = when(a){ 1,2,3 -> "表達式 a :$a" else -> "表達式 a :error" } log(out) // 表達式 a :3
-
in
表示范圍區(qū)間out = when(a){ in 1..5 -> "$a is in 1..5" else -> "out of range" } log(out) // 3 is in 1..5
-
is
表示檢查一個值out = when(a){ is Int -> "a is a Int" else -> "other type" } log(out) // a is a Int
-
when
可以不檢驗任何參數(shù)枚驻,所有的分支都是Boolean
濒旦,這時候如果一個分支的條件為true
時,則調(diào)用該分支when{ a is Int -> log("a is Int") // // a is Int else -> log("unknow type") }
-
如果有多個條件同時滿足再登,則調(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)
for
循環(huán),可以對任何提供迭代器(iterator
)的集合進行遍歷-
while
循環(huán)霎冯,使用方式和其他語言類似,有while
和do...while
兩種具體使用方式可以看我上一篇文章《Kotlin學習筆記(3)- 語法》中的“九钞瀑、循環(huán)”部分
四沈撞、返回和跳轉(zhuǎn)
-
和java一樣,kotlin中的返回和跳轉(zhuǎn)有三種方式雕什。
- return: 從最近的一個封閉的方法或者方法表達式跳出.
- break: 終止最近的封閉循環(huán)
- continue: 直接進入循環(huán)體的下次循環(huán)
-
除了上面三種常規(guī)的返回跳轉(zhuǎn)方式外缠俺,kotlin還啟用了一種特殊的用法:使用標識符
@
定義label,一般用在多層循環(huán)的內(nèi)層向外層跳轉(zhuǎn)贷岸。其中壹士,break
和label
結(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
而
continue
和label
結(jié)合,表示跳轉(zhuǎn)到指定循環(huán)層,繼續(xù)下一次循環(huán)盒使。下面的continue@label2
表示跳到第一層循環(huán)崩掘,繼續(xù)下一次循環(huán)。見輸出結(jié)果可知少办,在word
為b
時苞慢,跳出了當前的第二層循環(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