最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年07月09日 08:42:51   作者:淚已無痕  
這篇文章主要給大家介紹了關(guān)于Kotlin基礎(chǔ)學(xué)習(xí)之lambda中return語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用Kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

首先來看一個例子:

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

事實(shí)真是如此嗎?大家可以運(yùn)行一下上面的代碼,它的實(shí)際輸出是:

1
2
3
4
5

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

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ù)處理機(jī)制(相關(guān)講解可參考:Kotlin:關(guān)于內(nèi)聯(lián)函數(shù)的一些理解),我們的demo因?yàn)楸粌?nèi)聯(lián)最終會被編譯為:

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不是被偷吃了,而是因?yàn)閐emo函數(shù)在判斷條件滿足的情況下提前返回了,這樣的return用高端一點(diǎn)的語句就叫做:非局部返回。

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

indexes.forEach {
 if (it > 5) {
  return@forEach
 }
 println(it)
}

再次運(yùn)行一下 demo:

1
2
3
4
5
End 

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

indexes.forEach label@ {
 if (it > 5) {
  return@label
 }
 println(it)
}

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

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

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

運(yùn)行上面的例子會得到怎樣的輸出?不好意思,這個調(diào)用會因?yàn)榫幾g失敗不給你運(yùn)行的機(jī)會,

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

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

總結(jié)

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

相關(guān)文章

最新評論

陆丰市| 资阳市| 冷水江市| 泸溪县| 九龙县| 蓬莱市| 门源| 汕头市| 黄龙县| 黑河市| 射阳县| 莲花县| 勐海县| 手游| 崇礼县| 湟源县| 巨鹿县| 古浪县| 慈利县| 商都县| 郴州市| 巩留县| 乐清市| 瓮安县| 沽源县| 镇江市| 长武县| 梁山县| 巴马| 莲花县| 瑞金市| 九龙坡区| 望江县| 富裕县| 延寿县| 京山县| 师宗县| 东辽县| 通榆县| 木兰县| 调兵山市|