一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Kotlin基礎學習之lambda中return語句詳解

Kotlin基礎學習之lambda中return語句詳解

2022-03-10 15:23淚已無痕 Android

這篇文章主要給大家介紹了關于Kotlin基礎學習之lambda中return語句的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或使用Kotlin具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

當我們愛上lambda并且大范圍使用它的時候,我想大家都會被lambda中的return語句狠狠地調戲過,所以今天我們需要一起來揭開lambda中return的神秘面紗。

首先來看一個例子:

?
1
2
3
4
5
6
7
8
9
10
fun demo() {
 val indexes = arrayOf(1, 2, 3, 4, 5, 6, 7)
 indexes.forEach {
  if (it > 5) {
   return
  }
  println(it)
 }
 println("End")
}

按照我們的預期,調用demo后,它應該輸出:

1
2
3
4
5
End

事實真是如此嗎?大家可以運行一下上面的代碼,它的實際輸出是:

1
2
3
4
5

什么鬼?那個End被運行時給偷吃了嗎?不是,為了說明其中的緣由,讓我們看一下forEach的定義:

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

從定義中,我們可以看到forEach函數被定義為了內聯函數,而根據帶有lambda的內聯函數處理機制(相關講解可參考:Kotlin:關于內聯函數的一些理解),我們的demo因為被內聯最終會被編譯為:

?
1
2
3
4
5
6
7
8
9
10
fun demo() {
 val indexes = arrayOf(1, 2, 3, 4, 5, 6, 7)
 for (element in indexes) {
  if (element > 5) {
   return
  }
  println(element)
 }
 println("End")
}

從最終編譯后的代碼中我們可以很清楚的發現,最后的End不是被偷吃了,而是因為demo函數在判斷條件滿足的情況下提前返回了,這樣的return用高端一點的語句就叫做:非局部返回。

如果我們想要return從forEach(即lambda)中返回怎么辦?讓我們先改造一下上面對forEach的調用:

?
1
2
3
4
5
6
indexes.forEach {
 if (it > 5) {
  return@forEach
 }
 println(it)
}

再次運行一下 demo:

1
2
3
4
5
End 

這個時候的輸出就跟我們的預期一樣了,很神奇對不對?我們只要在return后面加一個@forEach就可以了,這就是所謂標簽返回(或局部返回),其完整的語法如下:

?
1
2
3
4
5
6
indexes.forEach label@ {
 if (it > 5) {
  return@label
 }
 println(it)
}

如果我們省略forEach后面label的定義,那么默認的label就是把lambda作為參數的函數名(這里是forEach)。

這就是lambda中return語句的所有內容,很簡單是不是?接下來就是盡情玩耍的時間了?別著急,這里還有一些注意事項,比如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fun doSomething(action: () -> Unit) {
 action()
}
 
inline fun doOtherThing(action: () -> Unit) {
 action()
}
 
fun main(args: Array<String>) {
 doSomething {
  return
 }
}
 
fun main(args: Array<String>) {
 var action = {
  return
 }
 doOtherThing(action)
}

運行上面的例子會得到怎樣的輸出?不好意思,這個調用會因為編譯失敗不給你運行的機會,

通過上面的討論我們知道,非局部返回是從lambda調用點所在的函數中返回,所以這就要求我們lambda中的return語句只能出現在內聯函數且該lambda表達式以參數形式直接傳遞給該函數的情況,其他情況不允許則是因為lambda可以綁定給一個變量以便在函數返回后繼續使用(比如閉包),而這個時候的return已經為時已晚。

好了,關于lambda控制流的內容就討論到這里了,最后祝愿大家快樂coding ^?_?^

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.jianshu.com/p/92cd94cba709

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月天婷婷网亚洲综合在线 | 久久水蜜桃亚洲AV无码精品偷窥 | 久久精品在现线观看免费15 | tk白丝丨vk| 日韩欧美一区二区三区免费看 | 超强台风免费观看完整版视频 | 91大神第九部红酒气质女 | 99久久成人 | 亚洲一区二区三区福利在线 | 亚洲国产成人精品 | 国产成人成人一区二区 | 国产思妍小仙女一二区 | 久久综合亚洲色hezyo | 大乳一级一区二区三区 | 高清不卡日本v在线二区 | 72张让男人一看就硬的图片 | 欧美区视频 | 99久久精品国产片久人 | 国产婷婷高清在线观看免费 | 性做久久久久久久久老女人 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲第一页综合 | 小柔的性放荡羞辱日记 | 精品国内自产拍在线视频 | 欧美香蕉| 婷婷色在线播放 | 日韩精品免费一区二区三区 | 五月香婷| 嫩草研究| 精品在线免费播放 | 波多野结衣女教师在线观看 | 国产视频自拍一区 | 成人啪啪漫画羞羞漫画www网站 | 校花小雪灌满了男人们的浓浆 | 欧美高清无砖专区欧美精品 | 青青青手机视频在线观看 | 亚洲羞羞裸色私人影院 | 好妈妈7在线观看高清 | 王雨纯 羞羞 | 久久中文电影 | 成人免费视频一区二区 |