前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin 进阶用法: 内联函数

Kotlin 进阶用法: 内联函数

作者头像
PhoenixZheng
发布2018-12-13 17:57:51
1.1K0
发布2018-12-13 17:57:51
举报

继上一篇文章给大家介绍完kotlin的扩展,这篇文章给大家讲讲kotlin中内联函数的用法。

什么是内联函数

内联函数:在程序编译时能将程序中内联函数的调用表达式直接替换成内联函数的函数体。 关键字:inline

看一个例子:

代码语言:javascript
复制
fun test() {
  var x = 1
  hello()
  print(x)
}

inline fun hello() {
    var a = 1
    var b = 1
    var c = a + b
    print(c)
}

这是我们在编译器上编写看到的代码,而实际编译的时候会变成

代码语言:javascript
复制
fun test() {
  var x = 1
  var a = 1
  var b = 1
  var c = a + b
  print(c)
  print(x)
}

但实际上如果你这么写,你会发现编译器会给你一个警告提醒,大致意思是说不建议你在这里使用内联函数,可能得不到收益。原因下面解释。

为什么要使用内联函数

在讲这个问题之前,我们先来讲解几个概念 1.高阶函数 高阶函数是将函数用作参数或返回值的函数。 2.lambda 表达式 描述函数的一种简洁的方式 所以我们经常会看到kotlin里面使用lambda表达式作为一个函数参数传递给其它函数。这个过程其实产生了很多隐性的开销。

  • lambda函数会被编译为函数对象(空间开销)
  • 如果lambda函数的输入输出为原始数据类型,需要额外的装箱,拆箱操作
  • 应用的方法总数会增加3-4个
  • 在执行实际的函数调用时,增加了函数压栈出栈等调用的时间开销

而kotlin中的内联函数,很巧妙地解决了这一问题。我们只需要将高阶函数声明为内联,参数中的lambda函数也会自动变成内联。即可避免以上说到的开销,当然是以增加代码量的代价换取。 所以可能的话,尽量将高阶函数声明为内联,保持代码行数为一个较小的数字,将大块代码移动到非内联函数中。

代码语言:javascript
复制
inline fun doCal(a: Int, b: Int, cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

如果不希望lambda函数变成内联,可以使用noinline关键字:

代码语言:javascript
复制
inline fun doCal(a: Int, b: Int, noinline cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

相信大家现在已经知道该什么时候使用内联函数了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是内联函数
  • 为什么要使用内联函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档