Kotlin内联函数

之前学了下高阶函数,知道了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开销。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值