上一章学了下高阶函数,我们可以用Lambda表达式很好的使用高阶函数,现在来看看高阶函数的原理,要知道Kotlin文件最终都是被编译成Java字节码的,但是Java中并没有高阶函数这个概念,其实Kotlin的编译器会将这些高阶函数的语法转换成Java支持的那种,比如上次我们写的计算两个数的和和差的函数:
fun main() {
val result = calculate(1, 2) { num1, num2 -> num1 - num2 }
}
fun calculate(num1: Int, num2: Int, function: (Int, Int) -> Int): Int {
return function(num1, num2)
}
它最后大致会被转换成下面的Java代码:
public static void main(){
int result = calculate(1,2,new Function(){
@Override
public Integer invoke(Integer param1,Integer param2){
return param1 + param2;
}
});
}
public static int calculate(int num1,int num2,Function function){
int result = (int) function.invoke(num1,num2);
return result;
}
这些并不是准确的代码,算是伪代码吧,能看懂就行,可以看到Lambda表达式最终实现是一个匿名内部类,既然是匿名内部类,那么久会造成额外的内存和性能开销。
为了解决这个问题,Kotlin提供了内联函数的功能,它可以将使用Lambda表达式带来的运行时开销完全消除,使用时只需要加上inline关键字声明就可以了,比如:
inline fun calculate(num1: Int, num2: Int, function: (Int, Int) -> Int): Int {
return function(num1, num2)
}
内联函数的作用就是:内联函数在编译时会自动的将函数体里面的代码自动的替换到其他位置去,比如,上面的Java代码中的result = (int) function.invoke(num1,num2);在编译时会直接被替换成result = num1+num2,接下来再把内联函数中的代码全部替换到函数调用的位置,那么mani函数就会变成:
public static void main(){
int result = num1 + num2;
}
就是这样,内联函数可以消除Lambda表达式锁带来的Runtime开销。
标签:num1,num2,Int,Kotlin,int,result,内联,函数
来源: https://blog.csdn.net/a644388262/article/details/110095658