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類型參數,則編譯器將生成警告。