kotlin 高階函數、內聯函數

1.高階函數

定義:一個函數接收另一個函數作爲參數,或者返回值的類型是另一個參數,那麼該函數就稱爲高階函數。

基本格式如下:

fun example(func:(String,Int)->Unit){
    func("holle",123)
}

例子:

    fun plus(num1: Int, num2: Int) = num1 + num2

    fun minus(num1: Int, num2: Int) = num1 - num2

    fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int) {
        operation(num1,num2)
    }

    //調用方式
    num1AndNum2(2,1,::plus)
    num1AndNum2(2,1,::minus)

lambda調用方式:

        num1AndNum2(2,1){
            n1,n2->n1+n2
        }

2.內聯函數

將上述高階函數轉化成java如下:

//轉化成java,通過創建類的實力並調用裏面的方法
public static int num1AndNum2(int num1,int num2,Function operation){
    int result = (int) operation.invoke(num1,num2);
    return result;
}

int result = num1AndNum2(2,1,new Function(){
    @Override
    public Integer invoke(Integer n1,Integer n2){
        return n1+n2;
    }
});

上述代碼可以看出lambda表達式是轉化成匿名內部類的形式完成的高階函數,實質上每次調用都會創建新的匿名類的實例。

內聯函數:kotlin編譯器會將內聯函數中的代碼在編譯的時候自動替換到調用它的地方,這樣不存在內存開銷。

    //在函數前面添加inline 就成爲內聯函數
    inline fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int) {
        Log.v("TAG",operation(num1,num2).toString())
    }

    //kotlin編譯前
    num1AndNum2(2,1){
        n1,n2->n1+n2
    }

    //kotlin編譯後
    Log.v("TAG",(2+1).toString())

noinline 讓內聯函數局部函數不會被內聯

內聯函數lambda表達式中的return是全局返回

高階函數lambda表達式中的return是局部返回

crossinline 確保內聯函數不會調用return

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章