【Kotlin從入門到深坑】之返回和跳轉

簡介

本篇博客主要是介紹Kotlin語法中的【返回和跳轉】相關的知識,幫助各位更快的掌握Kotlin,如果有疏漏或者錯誤,請在留言中指正,謝謝。 系列彙總地址


返回和跳轉

kotlin中有三種結構化跳轉表達式:

  • return: 默認從直接包圍的函數或匿名函數返回。
  • break: 終止最直接包圍它的循環。
  • continue: 繼續下次最直接包圍它的循環。

從上面的介紹中我們可以看出,和java是一致的,在此不再贅述,下面介紹點特殊用法。


標籤

在Kotlin中任何表達式都可以用標籤來標記。標記的格式爲:標識符+@,例如,abc@。如果想爲一個表達式加標籤,可按照如下方式去寫:

loop@ if (true){ //在表達式的前面加標籤

    }

break和continue標籤

對於breakcontinue默認情況下隻影響最直接包圍它的循環,想跳出多層循環就不可以了,但是加上標籤效果便不在一樣,代碼如下:
示例1,break標籤:

loop@ for (i in 1..10) {
        for (j in 1..10) {
            if (j == 2) {
                break@loop
            }
            println(i.toString() + ":" + j.toString())
        }
    }

此時的輸出如下:

1:1

通過結果我們可以看出,break +標籤 可以跳到標籤的位置,且跳轉到標籤指定的循環後面的執行點。 如果使用continue,會有怎樣的變化?

loop@ for (i in 1..10) {
        for (j in 1..10) {
            if (j == 2) {
                continue@loop //只是修改此處
            }
            println(i.toString() + ":" + j.toString())
        }
    }

結果如下:

1:1
2:1
3:1
4:1
5:1
6:1
7:1
8:1
9:1
10:1

從結果我們可以看出,continue+標籤 跳轉到循環的下一次迭代。


return 標籤

Kotlin 有函數字面量、局部函數和對象表達式(函數相關後續會專門詳細解釋)。因此 Kotlin 的函數可以被嵌套。 標籤限制的 return 允許我們從外層函數返回。 最重要的一個用途就是從 lambda 表達式中返回。示例如下:

fun foo() {
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}

這個 return 表達式從最直接包圍它的函數即 foo 中返回。 (注意,這種非局部的返回只支持傳給內聯函數的 lambda 表達式。) 如果我們需要從 lambda 表達式中返回,我們必須給它加標籤並用以限制 return

fun foo() {
    ints.forEach lit@ { //注意此處的位置
        if (it == 0) return@lit
        print(it)
    }
}

現在,它只會從 lambda 表達式中返回。通常情況下使用隱式標籤更方便。 該標籤與接受該 lambda 的函數同名。

fun foo() {
    ints.forEach {
        if (it == 0) return@forEach
        print(it)
    }
}

或者,我們用一個匿名函數替代 lambda 表達式。 匿名函數內部的 return 語句將從該匿名函數自身返回

fun foo() {
    ints.forEach(fun(value: Int) {
        if (value == 0) return
        print(value)
    })
}

當要返一個回值的時候,解析器優先選用標籤限制的 return,即

return@a 1

其含義爲“從標籤 @a 返回 1”,而不是“返回一個標籤標註的表達式 (@a 1)”


補充

Kotlin中有許多簡便的表達式,下面我們介紹一下。


if not null

代碼說明:

   //if not null
    var data: ArrayList<String>? = ArrayList<String>() //此時不爲null
    println(data?.size) //輸出: 0
    data = null //此時爲null
    println(data?.size) //輸出: null

總結:data?.size表達式的意思是:如果data不是null,則輸出data.size 反之如果是null則返回null


if null

代碼說明:

 data = null //此時爲null
 println(data ?: "這個是空的") //輸出:這個是空的
 data =1
 println(data ?: "這個是空的") //輸出:1

總結:data?:"測試" 表達式的含義是:如果datanull則運行後的語句或者方法,反之則返回data自身。


if not null else=> if null(if not null)

代碼說明:

    data = null //此時爲null
    println(data?.size ?:"這個是空的。。。")
     data = ArrayList<String>()//不爲null
    println(data?.size ?:"這個是空的。。。")

總結:從標題我們就可以看出,這個可以理解爲上面的兩個表達式的合集,data?.size ?:"這個是空的。。。" 表達式的含義是:如果data 不是null則返回data.size,如果是null則運行 後的語句或者方法。

換個思路去想:首先表達式總體上是個if null-> object?:"測試",而object-> if not null->data?.size ,這樣就比較好理解了,當datanull的時候,if not null,返回null(object爲null),又因爲 if null,所以會執行 後的內容,反之不是null,則會執行data.size,又因爲if null 條件不滿足,所以後續不會執行。


if not null 然後執行代碼

代碼說明:

data?.let {  //如果data不爲null會自行let代碼塊內的內容
        println("data不爲null,執行此處")
    }

總結

至此已經學完了Kotlin的【返回和跳轉】相關的知識,多回顧多思考,繼續後續內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章