本文分2部分
1,inline簡單分析
2,inline使用場景
一、inline 簡單理解
個人理解:
- 使用
inline關(guān)鍵字,編譯時會將代碼拷貝到調(diào)用的位置,以提高效率。
通過 內(nèi)置的Let 函數(shù),這個一個簡單例子解釋一下:
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
將高階函數(shù) let 的 inline 關(guān)鍵字刪除,如下:
fun <T, R> T.let2(block: (T) -> R): R {
return block(this)
}
測試代碼,僅打印出了日志:
class Test {
fun doTest() {
val name="zhangsan"
name.let {
Log.d("Kotlin- test : ", it)
}
val name2="zhangsan2"
name2.let2 {
Log.d("Kotlin- test2 : ", it)
}
}
}
//無 inline 關(guān)鍵字
fun <T, R> T.let2(block: (T) -> R): R {
return block(this)
}
通過 ide 反編譯 kt 代碼,查看區(qū)別:

反編譯kt.png
上圖可以看出,編譯器將 name1 調(diào)用的代碼,直接 copy到了調(diào)用的地方,故可以簡單理解為:使用 inline 會將代碼 copy 到使用處。
附:Android studio 如何反編譯 kt代碼

步驟-1.png

步驟-2.png
二,上面簡單介紹了一下 inline 繼續(xù)分析一下inline 使用
思考:使用 inline 后,會將代碼 拷貝 到調(diào)用處。如果方法特別長,拷貝這樣過去,會不會使代碼過于臃腫,給 JVM虛擬機造成負擔。 如果是這樣的話,那么 inline 是為了解決什么問題?
inline出現(xiàn),為了解決Lambda帶來的額外開銷
通過一個測試代碼簡單描述一下:
1,未使用 inline 反編譯出的結(jié)果為,testLambda 方法每次調(diào)用的時候,都 新建了一個實例:

未使用 inline.png

image.png
2,使用inline 反編譯出的結(jié)果為:

image.png
個人理解:實際開發(fā)中,如果在使用 Lambda 表達式 并且代碼相對較短的時候,可以考慮使用
inline,否則正常寫即可。