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