天天看點

Kotlin-5-高階函數+Unit+Inline

目錄

1、定義:

2、Unit的定義

3、高階函數的實作:

4、inline定義

5、inline 原理

6、如何在AndroidStudio中檢視kotlin編譯後的class源碼

1、定義:

高階函數是指: 函數(Lambda)的參數是函數(Lambda)

2、Unit的定義

3、高階函數的實作:

下面的gaoFun()函數的參數除了一個布爾類型的isSay以外,還有一個lambda函數作為了參數。這種函數我們就稱之為高階函數。

fun gaoFun(isSay: Boolean, lambda: () -> Unit) {
    if (isSay) {
        println("高階函數的參數lambda()匿名函數傳了進來")

        lambda()
    }
}

//main()函數的Unit就是省略的。(這裡我特意加上了)
fun main(): Unit {

    //這裡我們将lambda匿名函數傳給了gaoFun
    gaoFun(false, { println("我是高階函數") })

    //因為gaoFun函數的最後一個參數是Lambda,是以我們可以将lambda匿名函數放在小括号的後面
    gaoFun(true) { println("我也可以放在這裡") }

    
    /**
     * 這裡我聲明了一個Runnable匿名内部類,然後将匿名内部類的run匿名函數指派給了lambda
     */
    val runnable = Runnable {
        println("我是一個Runnable,我在被copy的時候就會運作")
    }

    val lambda: () -> Unit

    lambda = runnable::run

    gaoFun(true, lambda)

}
           

4、inline定義

inline---内聯函數

當我們在使用高階函數的時候,因為除了高階函數本身是個函數以外,它的參數或者傳回值也是一個Lambda函數,lambda函數内部還有局部變量,當在編譯運作的時候,因為每一個Lambda函數都是一個對象,并且還會捕獲一個閉包及閉包内會通路到的變量。 這樣在記憶體配置設定(對于函數對象和類)和虛拟機調用上都會加大運作時間開銷。

為了解決高階函數所帶來的額外開銷,kotlin加入了inline關鍵字。

注意:過多的使用inline關鍵字會對編譯器造成很大的性能壓力,是以我們建議隻在高階函數中使用inline關鍵字。

5、inline 原理

代碼在編譯以後,會将内聯函數的函數體複制到調用處。

下面左邊是我們的inline函數,右邊是我們編譯後的class檔案。

從編譯後的class可以看出,inline的函數體會被直接複制到調用該内聯函數的地方。

Kotlin-5-高階函數+Unit+Inline
Kotlin-5-高階函數+Unit+Inline

6、如何在AndroidStudio中檢視kotlin編譯後的class源碼

第一步:選擇你要檢視你的kotlin檔案,然後點選Tools-->Kotlin-->Show Kotlin Bytecode
Kotlin-5-高階函數+Unit+Inline
第二步:點選左上角的 Decompile 按鈕就會彈出你想要的class源碼
Kotlin-5-高階函數+Unit+Inline

繼續閱讀