目錄
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的函數體會被直接複制到調用該内聯函數的地方。
6、如何在AndroidStudio中檢視kotlin編譯後的class源碼
第一步:選擇你要檢視你的kotlin檔案,然後點選Tools-->Kotlin-->Show Kotlin Bytecode
第二步:點選左上角的 Decompile 按鈕就會彈出你想要的class源碼