Kotlin內聯函數
內聯函數使用關鍵字內聯聲明,內聯函數的使用增強了高階函數的性能。 內聯函數告訴編譯器將參數和函數複製到調用站點。
虛函數或局部函數不能聲明爲內聯。 以下是內聯函數內部不支持的一些表達式和聲明:
- 局部類聲明
- 內部嵌套類的聲明
- 函數表達式
- 聲明局部函數
局部可選參數的默認值
讓我們看一下內聯函數的基本示例:
fun main(args: Array<String>) {
inlineFunction({ println("調用內聯函數")})
}
inline fun inlineFunction(myFun: () -> Unit ) {
myFun()
print("內聯函數內的代碼")
}
執行上面示例代碼,得到以下結果 -
調用內聯函數
內聯函數內的代碼
非局部控制流程
從內聯函數,可以從lambda
表達式本身返回。 這也將導致退出調用內聯函數。 在這種情況下,允許函數文字具有非局部返回語句。
fun main(args: Array<String>) {
inlineFunction({ println("調用內聯函數")
return},{ println("內聯函數中的下一個參數")})
}
inline fun inlineFunction(myFun: () -> Unit, nxtFun: () -> Unit) {
myFun()
nxtFun()
print("內聯函數內的代碼")
}
執行上面示例代碼,得到以下結果 -
調用內聯函數
crossline註解
要防止從lambda表達式和內聯函數本身返回,可以將lambda
表達式標記爲crossinline
。 如果在lambda表達式中找到了return
語句,則會拋出編譯器錯誤。
fun main(args: Array<String>) {
inlineFunction({ println("calling inline functions")
return // compile time error
},{ println("next parameter in inline functions")})
}
inline fun inlineFunction(crossline myFun: () -> Unit, nxtFun: () -> Unit) {
myFun()
nxtFun()
print("code inside inline function")
}
noinline修飾符
在內聯函數中,當想要將內聯函數中傳遞的一些lambda作爲內聯函數時,使用noinline
修飾符標記其他函數參數。它用於設置不在調用中內聯的表達式。
fun main(args: Array<String>) {
inlineFunctionExample({ println("調用內聯函數")},
{ println("內聯函數中的下一個參數")} )
println("這是關閉main函數")
}
inline fun inlineFunctionExample(myFun: () -> Unit, noinline nxtFun: () -> Unit ) {
myFun()
nxtFun()
println("內聯函數內的代碼")
}
執行上面示例代碼,得到以下結果 -
調用內聯函數
內聯函數中的下一個參數
內聯函數內的代碼
這是關閉main函數
如果內聯函數不包含noinline
函數參數且沒有reified
類型參數,則編譯器將生成警告。