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

一、If表達(dá)式

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

// 傳統(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ù)和所有的分支條件順序比較,直到某個(gè)分支滿足條件。 when 既可以被當(dāng)做表達(dá)式使用也可以被當(dāng)做語句使用。如果它被當(dāng)做表達(dá)式, 符合條件的分支的值就是整個(gè)表達(dá)式的值,如果當(dāng)做語句使用, 則忽略個(gè)別分支的值。(像 if 一樣,每一個(gè)分支可以是一個(gè)代碼塊,它的值 是塊中最后的表達(dá)式的值。)

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

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

 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.我們也可以檢測一個(gè)值在(in)或者不在(!in)一個(gè)區(qū)間或者集合中:

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

4.另一種用法是檢測一個(gè)值是(is)或者不是(!is)一個(gè)特定類型的值。注意: 由于智能轉(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)一個(gè)分支的條件為真時(shí)則執(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)體可以是一個(gè)代碼塊

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

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

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

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

3.如果想要通過索引遍歷一個(gè)數(shù)組或者一個(gè) 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])
    }
再或者你想取一個(gè)值跳一個(gè),你可以這樣寫
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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容