Kotlin 进阶用法: 内联函数

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

什么是内联函数

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

看一个例子:

fun test() {
  var x = 1
  hello()
  print(x)
}

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

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

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函数也会自动变成内联。即可避免以上说到的开销,当然是以增加代码量的代价换取。 所以可能的话,尽量将高阶函数声明为内联,保持代码行数为一个较小的数字,将大块代码移动到非内联函数中。

inline fun doCal(a: Int, b: Int, cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

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

inline fun doCal(a: Int, b: Int, noinline cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

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

本文分享自微信公众号 - Android每日一讲(gh_f053f29083b9)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java初学

final和static关键字

372110
来自专栏深度学习思考者

Python学习(五)——列表操作全透析

  列表是以类的形式实现的。“创建”列表实际上是将一个类实例化。因此,列表有多种方法可以操作。Python列表操作的函数和方法 列表操作包含以下函数: ...

191100
来自专栏软件开发 -- 分享 互助 成长

java中String类学习

java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度。 (3)charAT:字...

21670
来自专栏锦小年的博客

Python学习笔记3.2-python内置函数大全

学习python不可避免的首先要了解python的内置函数,熟悉了这些以后可以给编程带来很大的方便。 1、数学运算类 函数名 函数功能 备注 abs...

28790
来自专栏java一日一条

java提高篇之关键字static

在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员...

10520
来自专栏python3

python 内置函数

基本的数据操作基本都是一些数学运算(当然除了加减乘除)、逻辑操作、集合操作、基本IO操作,然后就是对于语言自身的反射操作,还有就是字符串操作。

16720
来自专栏一名合格java开发的自我修养

python类与对象基本语法

对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类。

11630
来自专栏从零开始学 Web 前端

从零开始学 Web 之 JS 高级(三)apply与call,bind,闭包和沙箱

不同的是传入参数时,apply 有两个参数,第二个参数是数组;call 从第二个参数开始是调用其的函数的所有参数。

12430
来自专栏运维技术迷

PHP-函数

创建函数的语法 //function创建函数的关键字 function functionName() { 要执行的代码; } 函数准则 函数的名称应该显示出他的...

33970
来自专栏零基础使用Django2.0.1打造在线教育网站

关于JAVA你必须知道的那些事(三):继承和访问修饰符

今天乘着还有一些时间,把上次拖欠的面向对象编程三大特性中遗留的继承和多态给简单说明一下。这一部分还是非常重要的,需要仔细思考。

14530

扫码关注云+社区

领取腾讯云代金券