Kotlin學(xué)習(xí)(二)——流程控制語句

一制轰、If表達(dá)式

在 Kotlin 中敦腔,if是一個表達(dá)式均澳,即它會返回一個值。 因此就不需要三元運(yùn)算符(條件 ? 然后 : 否則)符衔,因?yàn)槠胀ǖ膇f 就能勝任這個角色找前。

// 傳統(tǒng)用法
var max = a
if (a < b) 
    max = b
else 
    var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// 作為表達(dá)式
val max = if (a > b) a else b

if的分支可以是代碼塊,最后的表達(dá)式作為該塊的值:

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

如果你使用 if 作為表達(dá)式而不是語句(例如:返回它的值或者 把它賦給變量)判族,該表達(dá)式需要有 else 分支躺盛。

二、When 表達(dá)式

when 取代了類 java中的 switch 操作符形帮。其最簡單的形式如下:

fun testWhen(a:Int){
    when(a){
        1 -> println("當(dāng)前傳入值為$a 11111")
        2 -> println("當(dāng)前傳入值為$a 22222")
        3 -> println("當(dāng)前傳入值為$a 33333")
        4 -> println("當(dāng)前傳入值為$a 44444")
        else -> print("沒有符合的匹配項(xiàng)")
    }
}

when 將它的參數(shù)和所有的分支條件順序比較槽惫,直到某個分支滿足條件。 when 既可以被當(dāng)做表達(dá)式使用也可以被當(dāng)做語句使用辩撑。如果它被當(dāng)做表達(dá)式界斜, 符合條件的分支的值就是整個表達(dá)式的值,如果當(dāng)做語句使用槐臀, 則忽略個別分支的值锄蹂。(像 if 一樣,每一個分支可以是一個代碼塊水慨,它的值 是塊中最后的表達(dá)式的值得糜。)

如果其他分支都不滿足條件將會求值 else 分支。 如果 when 作為一個表達(dá)式使用晰洒,則必須有 else 分支朝抖, 除非編譯器能夠檢測出所有的可能情況都已經(jīng)覆蓋了。

1.如果很多分支需要用相同的方式處理谍珊,則可以把多個分支條件放在一起治宣,用逗號分隔:

 when(a){
        1,3 -> println("當(dāng)前傳入值為$a")
        else ->  print("沒有符合的匹配項(xiàng)")
    }

2.我們可以用任意表達(dá)式(而不只是常量)作為分支條件

when (a) {
        parseInt("3") -> print("s encodes x")
        else -> print("s does not encode x")
    }

3.我們也可以檢測一個值在(in)或者不在(!in)一個區(qū)間或者集合中:

 when (a) {
        in 1..10 -> print("在1——10區(qū)間")
        !in 10..20 -> print("不在10——20區(qū)間")
        else -> print("不在有效范圍區(qū)間")
    }

4.另一種用法是檢測一個值是(is)或者不是(!is)一個特定類型的值。注意: 由于智能轉(zhuǎn)換砌滞,你可以訪問該類型的方法和屬性而無需 任何額外的檢測侮邀。

 when(a){
        is String -> print("傳入的值是String類型")
        is Int -> print("傳入的值是Int類型")
        is Long -> print("傳入的值是Long類型")
        is ExampleUnitTest -> print("傳入的值是ExampleUnitTest類型")
    }

5.when 也可以用來取代 if-else if鏈。 如果不提供參數(shù)贝润,所有的分支條件都是簡單的布爾表達(dá)式绊茧,而當(dāng)一個分支的條件為真時則執(zhí)行該分支:

 when {
        a is String -> print("傳入的值是String類型")
        a is Int -> print("傳入的值是Int類型")
        a is Long -> print("傳入的值是Long類型")
        a is ExampleUnitTest -> print("傳入的值是ExampleUnitTest類型")
    }

三、For循環(huán)

1.for 循環(huán)可以對任何提供迭代器(iterator)的對象進(jìn)行遍歷打掘,語法如下:

fun testFor(){
    val stringArrays : Array<String> = arrayOf("hello","kotlin","hello","android")
    for (item in stringArrays){
        println(item)
    }
}

2.循環(huán)體可以是一個代碼塊

val stringArrays : Array<String> = arrayOf("hello","kotlin","hello","android")
    for (item: String in stringArrays ){
        println(item+"第二種方式遍歷數(shù)組")
    }

如上所述华畏,for 可以循環(huán)遍歷任何提供了迭代器的對象鹏秋。即:

有一個成員函數(shù)或者擴(kuò)展函數(shù) iterator(),它的返回類型
有一個成員函數(shù)或者擴(kuò)展函數(shù) next()亡笑,并且
有一個成員函數(shù)或者擴(kuò)展函數(shù) hasNext() 返回 Boolean侣夷。
這三個函數(shù)都需要標(biāo)記為 operator。

對數(shù)組的 for 循環(huán)會被編譯為并不創(chuàng)建迭代器的基于索引的循環(huán)

3.如果想要通過索引遍歷一個數(shù)組或者一個 list仑乌,你可以這么做:

val stringArrays : Array<String> = arrayOf("hello","kotlin","hello","android")
    for (i in stringArrays.indices) {
        println(stringArrays[i])
    }
或者
 val stringArrays : Array<String> = arrayOf("hello","kotlin","hello","android")
    for (i in 0..stringArrays.size-1) {
        println(stringArrays[i])
    }
再或者你想取一個值跳一個百拓,你可以這樣寫
val stringArrays : Array<String> = arrayOf("hello","kotlin","hello","android")
    for (i in 0..stringArrays.size-1 step 1) {
        println(stringArrays[i])
    }

4.forEach 使用

val stringArrays : Array<Int> = arrayOf(1,2,3,1,4,5,6)
stringArrays.forEach { println(it); }

四、While 循環(huán)

while 和 do..while 和Java里面使用沒有什么區(qū)別

while (x > 0) {
    x--
}
do {
    val y = retrieveData()
} while (y != null)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绝骚,一起剝皮案震驚了整個濱河市耐版,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌压汪,老刑警劉巖粪牲,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異止剖,居然都是意外死亡腺阳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門穿香,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亭引,“玉大人,你說我怎么就攤上這事皮获”候荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵洒宝,是天一觀的道長购公。 經(jīng)常有香客問我,道長雁歌,這世上最難降的妖魔是什么宏浩? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮靠瞎,結(jié)果婚禮上比庄,老公的妹妹穿的比我還像新娘。我一直安慰自己乏盐,他們只是感情好佳窑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著父能,像睡著了一般神凑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上法竞,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天耙厚,我揣著相機(jī)與錄音,去河邊找鬼岔霸。 笑死薛躬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呆细。 我是一名探鬼主播型宝,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼絮爷!你這毒婦竟也來了趴酣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坑夯,失蹤者是張志新(化名)和其女友劉穎岖寞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柜蜈,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仗谆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑履。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隶垮。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秘噪,靈堂內(nèi)的尸體忽然破棺而出狸吞,到底是詐尸還是另有隱情,我是刑警寧澤指煎,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布蹋偏,位于F島的核電站,受9級特大地震影響贯要,放射性物質(zhì)發(fā)生泄漏暖侨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一崇渗、第九天 我趴在偏房一處隱蔽的房頂上張望字逗。 院中可真熱鬧,春花似錦宅广、人聲如沸葫掉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俭厚。三九已至,卻和暖如春驶臊,著一層夾襖步出監(jiān)牢的瞬間挪挤,已是汗流浹背叼丑。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛门,地道東北人鸠信。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像论寨,于是被迫代替她去往敵國和親星立。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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

  • Kotlin系統(tǒng)化學(xué)習(xí)-20170823文章中有大部分內(nèi)容是借鑒《Kotlin實(shí)戰(zhàn)》中文版葬凳,特此注明一下绰垂。 Kot...
    ClAndEllen閱讀 1,662評論 2 10
  • 86.復(fù)合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,366評論 1 5
  • 前言 人生苦多火焰,快來 Kotlin 劲装,快速學(xué)習(xí)Kotlin! 什么是Kotlin荐健? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,209評論 9 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理酱畅,服務(wù)發(fā)現(xiàn),斷路器江场,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 發(fā)現(xiàn)問題 在項(xiàng)目中做一個發(fā)送多張圖片到服務(wù)器的功能纺酸,在發(fā)送前要將圖片進(jìn)行壓縮并保存,然后拿到保存后的路徑進(jìn)行圖片的...
    AndroidHint閱讀 1,161評論 0 1