流程控制:返回和跳轉

和 Java 相同,Kotlin 中有三個用來跳轉的關鍵字:returnbreak 和 continuejava

它們的基本用法與 Java 一致:數組

  1. return:返回函數的值或終止函數函數運行;app

  2. break:終止循環;ide

  3. continue:跳轉到下一次循環。函數

與 Java 相同,它們跳轉的對象都是最直接包圍它們的函數或循環。oop

咱們重點看一下 Kotlin 中強化版的 標籤this

Kotlin 中的標籤能夠用在任何表達式前,格式以下:spa

標籤名@ 表達式  //標籤名爲合法的標識符,與變量名和函數名格式相同

在循環中使用標籤,能夠指定跳轉的位置:orm

loop@ for (i in 1..10) {
  for (j in 1..10) {
    if(...) break@loop //終止 i 循環
  }}

若是咱們不使用 loop 標籤,break 將會終止 j 的循環;對象

這裏 Kotlin 中的標籤還只是與 Java 中的標籤同樣,起到控制流程的做用,但 Kotlin 標籤的強大之處在於它還能夠控制 return 的返回對象。

首先看一個例子:

fun main(args: Array<String>){
  val ints = intArrayOf(1, 2, 3)
  ints.forEach {
    if (it == 2) return
    println(it)
  }}

它的輸出結果是 1。

首先解釋一下 forEach() 這個函數,它是 _Arrays.kt 文件中定義的擴展函數,全部數組都擴展了這個函數:

public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {
    for (element in this) action(element)}

能夠看到,它接收一個沒有返回值的函數,並使用 for 循環遍歷數組中的每一個元素,對每一個元素執行傳入函數的操做。

上面的例子裏,咱們使用 forEach() 函數遍歷 ints 數組中的元素,對於每一個元素,咱們檢查它是否等於 2,若是等於 2 則跳過,不等於 2 則打印這個元素。

可是 return 只會跳出一個顯式定義的函數,不會跳出 lambda 表達式,因此這裏的 return 會直接跳出 main() 函數,結束進程,後面的 3 沒有遍歷到。

若是咱們想跳出 lambda 表達式,能夠用標籤標記這個 lambda 表達式,而後讓 return 返回到這個標籤處:

ints.forEach lit@{
  if(it == 2) return@lit
  println(it)}

這樣,程序運行到 it = 2 時,會直接返回到 lit 標籤標記的函數開始處,繼續下一次遍歷,輸出 1 和 3 。

Kotlin 爲了簡化程序,會給每一個高階函數添加一個 隱式標籤,這個標籤與函數同名,上面的程序能夠寫爲:

ints.forEach {
  if(it == 2) return@forEach
  println(it)}

此外,若是 return 後有返回值,再加標籤就要寫成 return@標籤 返回值 的形式:

return@loop 1 // 返回值 1 到 loop 標記的函數處
相關文章
相關標籤/搜索