Kotlin學(xué)習(xí)(二):控制語(yǔ)句詳解篇

Kotlin學(xué)習(xí)(二):控制語(yǔ)句詳解篇

前言

通過上一篇的學(xué)習(xí),我們對(duì)kotlin已經(jīng)掌握了函數(shù)的定義,基本數(shù)據(jù)類型,null安全設(shè)計(jì),類型檢測(cè)及自動(dòng)轉(zhuǎn)換和Kotlin的區(qū)間表達(dá)式,如果您還有任何不明白的地方,請(qǐng)?zhí)D(zhuǎn)至我的上一篇博客:
《Kotlin學(xué)習(xí)(一):我TM謝謝你!(基礎(chǔ)語(yǔ)法篇)》
對(duì)于kotlin,這只是最基礎(chǔ)的入門講解,也希望大家能夠跟我一樣逐漸適應(yīng)kotlin的美,我們一起進(jìn)步,我相信通過一段時(shí)間的學(xué)習(xí),我也可以像大家分享一些kotlin的語(yǔ)法糖以及更深入的使用。我的博客(Power)

kotlin控制語(yǔ)句詳解

  • 條件控制語(yǔ)句:if 語(yǔ)句、when 語(yǔ)句
  • 循環(huán)控制語(yǔ)句:for 循環(huán)、while與do...while 循環(huán)
  • 返回和跳轉(zhuǎn)語(yǔ)句:return、 break、 continue

1. if語(yǔ)句

kotlin的if表達(dá)式其實(shí)和java是非常類似的,唯一不同的地方在于kotlin可以把表達(dá)式的結(jié)果賦值給變量,類似于java的三元運(yùn)算符,我們可以直接實(shí)現(xiàn)。

// 傳統(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

舉例:

fun main(args: Array<String>) {
    var x = 0
    if(x>0){
        println("x 大于 0")
    }else if(x==0){
        println("x 等于 0")
    }else{
        println("x 小于 0")
    }

    var a = 1
    var b = 2
    val c = if (a>=b) a else b
    println("c 的值為 $c")
}
//輸出結(jié)果為:
x 等于 0
c 的值為 2

2. when表達(dá)式

when 將它的參數(shù)和所有的分支條件順序比較,直到某個(gè)分支滿足條件。
when 既可以被當(dāng)做表達(dá)式使用也可以被當(dāng)做語(yǔ)句使用。如果它被當(dāng)做表達(dá)式,符合條件的分支的值就是整個(gè)表達(dá)式的值,如果當(dāng)做語(yǔ)句使用, 則忽略個(gè)別分支的值。
我們看下例子:

//在 when 中,else 同 switch 的 default。如果其他分支都不滿足條件將會(huì)求值 else 分支
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意這個(gè)塊,else 相當(dāng)于 switch 的 default
        print("x 不是 1 ,也不是 2")
    }
}

//如果很多分支需要用相同的方式處理,則可以把多個(gè)分支條件放在一起,用逗號(hào)分隔
when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

//我們也可以檢測(cè)一個(gè)值在(in)或者不在(!in)一個(gè)區(qū)間或者集合中
when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

//另一種可能性是檢測(cè)一個(gè)值是(is)或者不是(!is)一個(gè)特定類型的值。注意: 由于智能轉(zhuǎn)換,你可以訪問該類型的方法和屬性而無(wú)需 任何額外的檢測(cè)
fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

//when 也可以用來(lái)取代 if-else if鏈。 如果不提供參數(shù),所有的分支條件都是簡(jiǎn)單的布爾表達(dá)式,而當(dāng)一個(gè)分支的條件為真時(shí)則執(zhí)行該分支
when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}

//when 中使用 in 運(yùn)算符來(lái)判斷集合內(nèi)是否包含某實(shí)例
fun main(args: Array<String>) {
    val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}

舉例:

fun main(args: Array<String>) {
    var x = 0
    when (x) {
        0, 1 -> println("x == 0 or x == 1")
        else -> println("otherwise")
    }

    when (x) {
        1 -> println("x == 1")
        2 -> println("x == 2")
        else -> { // 注意這個(gè)塊
            println("x 不是 1 ,也不是 2")
        }
    }

    when (x) {
        in 0..10 -> println("x 在該區(qū)間范圍內(nèi)")
        else -> println("x 不在該區(qū)間范圍內(nèi)")
    }
}
//輸出結(jié)果:
x == 0 or x == 1
x 不是 1 ,也不是 2
x 在該區(qū)間范圍內(nèi)

3. for循環(huán)

  • for 循環(huán)可以對(duì)任何提供迭代器(iterator)的對(duì)象進(jìn)行遍歷
  • kotlin 廢除了 java 的 for(int i = 0; i < list.size(); i++)規(guī)則,新增了其他的規(guī)則,來(lái)滿足對(duì)數(shù)組或集合的遍歷
  • 循環(huán)數(shù)組會(huì)編譯成優(yōu)化的實(shí)現(xiàn)而不會(huì)創(chuàng)建額外對(duì)象,或者你可以用庫(kù)函數(shù) withIndex:
//for循環(huán)可以對(duì)任何提供迭代器(iterator)的對(duì)象進(jìn)行遍歷
for (item in collection) print(item)
for (item: Int in ints) {
    // ……
}

//如果你想要通過索引遍歷一個(gè)數(shù)組或者一個(gè) list
for (i in array.indices) {
    print(array[i])
}

//循環(huán)數(shù)組會(huì)編譯成優(yōu)化的實(shí)現(xiàn)而不會(huì)創(chuàng)建額外對(duì)象,或者你可以用庫(kù)函數(shù) withIndex:
for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

舉例:

// 循環(huán)5次,且步長(zhǎng)為1的遞增
for (i in 0 until 5){
  print("i => $i \t")
}

// 循環(huán)5次,且步長(zhǎng)為1的遞減
for (i in 15 downTo 11){
    print("i => $i \t")
}

print("使用 符號(hào)`..`的打印結(jié)果\n")
for (i in 20 .. 25){
    print("i => $i \t")
}

print("使用until的打印結(jié)果\n")
for (i in 20 until 25){
    print("i => $i \t")
}
//輸出結(jié)果:
使用 符號(hào)`..`的打印結(jié)果
i => 20  i => 21  i => 22  i => 23  i => 24  i => 25     
使用until的打印結(jié)果
i => 20  i => 21  i => 22  i => 23  i => 24 

//使用數(shù)組的indices屬性遍歷
var arrayListTwo = arrayOf(1,3,5,7,9)
for (i in arrayListTwo.indices){
    println("arrayListTwo[$i] => " + arrayListTwo[i])
}
//輸出結(jié)果:
arrayListTwo[0] => 1
arrayListTwo[1] => 3
arrayListTwo[2] => 5
arrayListTwo[3] => 7
arrayListTwo[4] => 9

//使用數(shù)組的withIndex()方法遍歷
var arrayListTwo = arrayOf(1,3,5,7,9)
for ((index,value) in arrayListTwo.withIndex()){
    println("index => $index \t value => $value")
}
//輸出結(jié)果:
index => 0   value => 1
index => 1   value => 3
index => 2   value => 5
index => 3   value => 7
index => 4   value => 9

4. while, do...while語(yǔ)句

kotlin的while語(yǔ)句和java的while語(yǔ)句一樣,下面我們直接舉栗:

var num = 5
var count = 1
while (num < 10){
    println("num => $num")
    println("循環(huán)了$count 次")
    count++
    num++
}
//輸出結(jié)果:
num => 5
循環(huán)了1 次
num => 6
循環(huán)了2 次
num => 7
循環(huán)了3 次
num => 8
循環(huán)了4 次
num => 9
循環(huán)了5 次

//do...while語(yǔ)句
var num = 5
var count = 1
do {
    println("num => $num")
    println("循環(huán)了$count 次")
    count++
    num++
}while (num < 10)
//輸出結(jié)果:
num => 5
循環(huán)了1 次
num => 6
循環(huán)了2 次
num => 7
循環(huán)了3 次
num => 8
循環(huán)了4 次
num => 9
循環(huán)了5 次

// *注* : do{...}while(exp)與while(exp){...}最大的區(qū)別是do{...}while(exp)最少執(zhí)行一次,這點(diǎn)也是和Java相同的

5. 返回和跳轉(zhuǎn)語(yǔ)句

return、break、continue的用法和java是一樣的,

  • eturn。默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回
  • break。終止最直接包圍它的循環(huán)
  • continue。繼續(xù)下一次最直接包圍它的循環(huán)
    我們直接看代碼吧:
fun main(args: Array<String>) {
    for (i in 1..10) {
        if (i==3) continue  // i 為 3 時(shí)跳過當(dāng)前循環(huán),繼續(xù)下一次循環(huán)
        println(i)
        if (i>5) break   // i 為 6 時(shí) 跳出循環(huán)
    }
}
//輸出結(jié)果為:1 2 4 5 6

fun returnExample(){
    var str: String = ""
    if (str.isBlank()){
        println("我退出了該方法")
        return
    }
}
//輸出結(jié)果為:我退出了該方法
  • Break 和 Continue 標(biāo)簽
    在 Kotlin 中任何表達(dá)式都可以用標(biāo)簽(label)來(lái)標(biāo)記。 標(biāo)簽的格式為標(biāo)識(shí)符后跟 @ 符號(hào),例如:abc@、fooBar@都是有效的標(biāo)簽。 要為一個(gè)表達(dá)式加標(biāo)簽,我們只要在其前加標(biāo)簽即可
loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (……) break@loop
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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