Kotlin學習之-4.3.4 返回和中止循環

Kotlin學習之-4.3.4 返回和中止循環

Kotlin 有3中結構化的跳轉語句:

  • return,默認是從最近的函數或者匿名函數中中返回。
  • break,中止最近的循環
  • continue,從當前的循環中繼續執行下一次循環

所有這些表達式都可以被用來組成更大的表達式

val s = person.name ?: return

基於標籤的break 和continue

Kotlin中的任何表達式都可以被 標記成一個標籤label,標籤由一個標識符和緊跟的@組成,例如:abc@, fooBar@ 是合法的標籤命名。 想要把一個表達式定義成標籤,只要在它簽名寫一個標籤即可。

loop@ for (i in 1..100) {
    //...
}

現在我們可以針對這個標籤來使用breakcontinue

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

一個帶標籤的break 語句,會把執行點跳轉到標籤標記的位置之後。 一個帶標籤continue語句,會還執行循環的下一輪遍歷。

在標籤位置返回

Kotlin支持的函數語法可以讓本地函數,對象表達式和函數可以內嵌在一起。帶有標籤的return語句可以讓我們從一個外層的函數中返回。 最終要的用例就是從一個lambda表達式中返回。例如:

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

這個return語句會從最近的函數中返回,也就是會從foo()函數中返回。(注意這種非局部的返回只是在lambda表達式中支持傳遞給內聯函數)。如果我們需要從一個lambda表達式中返回,我們只能先標記它,然後使用帶標籤的返回語句。

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

現在它只是從lambda表達式中返回。還有時候,使用隱式標籤會更加方便:隱式標籤的名字和調用這個lambda表達式的函數名是一樣的。

fun foo() {
    val intArray2 = intArrayOf(1, 2, 3)
    // will print 13  skip 2
    intArray2.forEach {
        if (it == 2) return@forEach
        print(it)
    }
}

或者還可以把lambda表達式替換成給一個匿名函數。一個返回語句在一個匿名函數中會從匿名函數中返回。

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

如果需要返回值,解析器需要一個參數,例如:

return@a 1

意味着在@a這個位置返回1, 而不是返回一個標籤表達式(@a 1)

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