激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

香港云服务器
服務(wù)器之家 - 編程語言 - Android - Kotlin基礎(chǔ)學(xué)習(xí)之lambda中return語句詳解

Kotlin基礎(chǔ)學(xué)習(xí)之lambda中return語句詳解

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

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

前言

當(dāng)我們愛上lambda并且大范圍使用它的時候,我想大家都會被lambda中的return語句狠狠地調(diào)戲過,所以今天我們需要一起來揭開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")
}

按照我們的預(yù)期,調(diào)用demo后,它應(yīng)該輸出:

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函數(shù)被定義為了內(nèi)聯(lián)函數(shù),而根據(jù)帶有l(wèi)ambda的內(nèi)聯(lián)函數(shù)處理機制(相關(guān)講解可參考:Kotlin:關(guān)于內(nèi)聯(lián)函數(shù)的一些理解),我們的demo因為被內(nèi)聯(lián)最終會被編譯為:

?
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")
}

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

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

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

再次運行一下 demo:

1
2
3
4
5
End 

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

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

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

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

?
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)
}

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

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

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

總結(jié)

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

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

延伸 · 閱讀

精彩推薦
1178
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 成人免费观看毛片 | 干一夜综合 | 国产精品视频yy9299一区 | 免费一级毛片在线播放视频 | 久久久婷婷一区二区三区不卡 | 久久久国产一级片 | 国产精品久久久久久久久久三级 | 欧美一级黄色免费 | 亚洲成人国产综合 | 在线视频 亚洲 | 精品久久久91 | av在线在线| 男女牲高爱潮免费视频男女 | 永久av在线免费观看 | 操皮视频| 把娇妻调教成暴露狂 | 深夜小视频在线观看 | 成人在线免费观看网址 | 亚洲一区成人在线观看 | 欧洲精品久久久 | 成人午夜视频在线观看免费 | 久精品久久 | 伊人999| 成人毛片视频在线播放 | 在线小视频国产 | 久久一级 | 国产色爱综合网 | 久久亚洲精品久久国产一区二区 | 国产一级中文字幕 | 91精品国产综合久久久欧美 | 久久狠狠高潮亚洲精品 | 亚洲伊人色欲综合网 | 自拍亚洲伦理 | 成人黄色短视频在线观看 | 久久亚洲成人 | 国产一区二区免费在线观看 | 国产午夜三级一区二区三桃花影视 | japanesexxxx24videofree | 91精品国产乱码久 | 国产亚洲精品久久久久婷婷瑜伽 | 欧美日韩手机在线观看 |