Kotlin inline 關(guān)鍵字软吐,內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)關(guān)鍵字

1.inline
2.noinline
3.crossinline

inline 是Kotlin 修飾方法的關(guān)鍵字。
noinline 挽荡,crossinline 是配合帶有inline 方法修飾參數(shù)的關(guān)鍵字入录。

用法 并且 分析

inline

內(nèi)聯(lián)函數(shù)寫(xiě)法
內(nèi)聯(lián)函數(shù)相當(dāng)于在該函數(shù)內(nèi)权逗,在調(diào)用另一個(gè)函數(shù)越庇,某些需要開(kāi)發(fā)者自己實(shí)現(xiàn)的功能它褪,我只需傳入固定好的參數(shù),可根據(jù)需求定義返回值陶贼。
在sun函數(shù)前后處理一些固定的邏輯處理。

inline fun addUp(a: Int, b: Int, sum: (sum: Int) -> Unit) {
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行前待秃。")
    sum(a + b)
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行后拜秧。")
}

Java 調(diào)用內(nèi)聯(lián)函數(shù)寫(xiě)法
方法中最后一個(gè)參數(shù)就是平常寫(xiě)的回調(diào)。
Function1 第一個(gè)泛型是傳入的參數(shù)類(lèi)型章郁,第二個(gè)是返回值類(lèi)型枉氮。Kolitn 中 Unit 等同于Java void。
如果參數(shù)是多個(gè) Function1 - Function21 針對(duì)參數(shù)個(gè)數(shù)自行創(chuàng)建暖庄。
如果超過(guò)21一個(gè)參數(shù)聊替,那你就要考慮自己的方法是不是定義的有問(wèn)題了,可拆分培廓,Kotlin 中支持多個(gè)代碼塊參數(shù)惹悄。
結(jié)論 inline 在Java用法等同于Java 的回調(diào)。

TestInLineKt.addUp(10, 20, new Function1<Integer, Unit>() {
    @Override
    public Unit invoke(Integer integer) {
        System.out.println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行結(jié)果肩钠。$it");
        return null;
    }
});

Kotlin 調(diào)用內(nèi)聯(lián)函數(shù)
調(diào)用方法泣港,最后一個(gè)參數(shù)如果是代碼塊參數(shù)暂殖,可以寫(xiě)在小括號(hào)外面。

fun main(args: Array<String>) {
    val a = 10
    valb = 20
    addUp(a, b) {
        println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行結(jié)果当纱。$it")
    }
}

noinline

ps:內(nèi)聯(lián)函數(shù)在字節(jié)碼中會(huì)進(jìn)行優(yōu)化呛每,將整個(gè)內(nèi)聯(lián)函數(shù)全部放到調(diào)用地方,等同于沒(méi)有調(diào)用方法坡氯,在運(yùn)行過(guò)程中減少了入棧出棧的過(guò)程晨横。
等同于寫(xiě)法

fun main(args: Array<String>) {
    val a = 10
    val b = 20
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行前。")
    var sum = a + b
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行結(jié)果箫柳。$sum")
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行后手形。")
}

上面案例只寫(xiě)了內(nèi)聯(lián)函數(shù)中只包含一個(gè)代碼塊參數(shù)。
如果需要將內(nèi)聯(lián)代碼塊滞时,傳遞個(gè)另一個(gè)沒(méi)有 inline 修飾的方法將會(huì)提示錯(cuò)誤叁幢。
需要添加 noinline 參數(shù)修飾,也就意味著這個(gè)參數(shù)將不會(huì)被編譯成字節(jié)碼的時(shí)候優(yōu)化坪稽。

inline fun addUp(a: Int, b: Int, noinline sum: (sum: Int) -> Unit) {
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行前曼玩。")
    check(sum)
    println("內(nèi)聯(lián)函數(shù) sum 執(zhí)行后。")
}

fun check(sum: (i: Int) -> Unit) {
    println("另一個(gè)內(nèi)聯(lián)函數(shù)窒百。")
    sum(20)
}

crossinline

在代碼中任何位置都可以寫(xiě) return 關(guān)鍵字黍判,但是在內(nèi)聯(lián)函數(shù)中經(jīng)過(guò)jvm優(yōu)化整個(gè)方法會(huì)被復(fù)制到調(diào)用的地方包括return,這就造成了下面方法無(wú)法運(yùn)行篙梢。
在addUp代碼塊中添加 return 關(guān)鍵字運(yùn)行顷帖。

fun main(args: Array<String>) {
    val a = 10
    val b = 20
    println("調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行前。")
    addUp(a, b) {
        println("內(nèi)聯(lián)方法 sum 執(zhí)行結(jié)果渤滞。$it")
        return
    }
    println("調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行后贬墩。")
}


inline fun addUp(a: Int, b: Int, sum: (sum: Int) -> Unit) {
    println("內(nèi)聯(lián)方法 sum 執(zhí)行前。")
    sum(a + b)
    println("內(nèi)聯(lián)方法 sum 執(zhí)行后妄呕。")
}

打印結(jié)果:沒(méi)有打印 “內(nèi)聯(lián)方法 sum 執(zhí)行后陶舞。” 和 “調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行后绪励≈追酰” 代碼方法在之前被終止。

調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行前疏魏。
內(nèi)聯(lián)方法 sum 執(zhí)行前停做。
內(nèi)聯(lián)方法 sum 執(zhí)行結(jié)果。30

Process finished with exit code 0

解決辦法
一. 指定 return 退出哪個(gè)函數(shù)大莫。@ 后面跟內(nèi)聯(lián)函數(shù)的名稱(chēng)

return@addUp

二.在方法一中蛉腌,如不指定 return 出哪個(gè)函數(shù)不會(huì)有語(yǔ)法檢測(cè),當(dāng)在內(nèi)聯(lián)函數(shù)中添加 crossinline 關(guān)鍵字后,return 后面會(huì)強(qiáng)制指定退出當(dāng)前內(nèi)聯(lián)函數(shù)眉抬。

fun main(args: Array<String>) {
    val a = 10
    val b = 20
    println("調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行前贯吓。")
    addUp(a, b) {
        println("內(nèi)聯(lián)方法 sum 執(zhí)行結(jié)果。$it")
        return@addUp
    }
    println("調(diào)用內(nèi)聯(lián)函數(shù)執(zhí)行后蜀变。")
}


inline fun addUp(a: Int, b: Int, crossinline sum: (sum: Int) -> Unit) {
    println("內(nèi)聯(lián)方法 sum 執(zhí)行前悄谐。")
    sum(a + b)
    println("內(nèi)聯(lián)方法 sum 執(zhí)行后。")
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末库北,一起剝皮案震驚了整個(gè)濱河市爬舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寒瓦,老刑警劉巖情屹,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杂腰,居然都是意外死亡垃你,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)喂很,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惜颇,“玉大人,你說(shuō)我怎么就攤上這事少辣×枭悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵漓帅,是天一觀(guān)的道長(zhǎng)锨亏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)忙干,這世上最難降的妖魔是什么器予? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮捐迫,結(jié)果婚禮上乾翔,老公的妹妹穿的比我還像新娘。我一直安慰自己弓乙,他們只是感情好末融,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布钧惧。 她就那樣靜靜地躺著暇韧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浓瞪。 梳的紋絲不亂的頭發(fā)上懈玻,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音乾颁,去河邊找鬼涂乌。 笑死艺栈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湾盒。 我是一名探鬼主播湿右,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罚勾!你這毒婦竟也來(lái)了毅人?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尖殃,失蹤者是張志新(化名)和其女友劉穎丈莺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體送丰,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缔俄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器躏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐载。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邀桑,靈堂內(nèi)的尸體忽然破棺而出瞎疼,到底是詐尸還是另有隱情,我是刑警寧澤壁畸,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布贼急,位于F島的核電站,受9級(jí)特大地震影響捏萍,放射性物質(zhì)發(fā)生泄漏太抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一令杈、第九天 我趴在偏房一處隱蔽的房頂上張望走敌。 院中可真熱鬧,春花似錦逗噩、人聲如沸掉丽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捶障。三九已至,卻和暖如春纲刀,著一層夾襖步出監(jiān)牢的瞬間项炼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锭部,地道東北人暂论。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拌禾,于是被迫代替她去往敵國(guó)和親取胎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容