目录
1、定义:
2、Unit的定义
3、高阶函数的实现:
4、inline定义
5、inline 原理
6、如何在AndroidStudio中查看kotlin编译后的class源码
1、定义:
高阶函数是指: 函数(Lambda)的参数是函数(Lambda)
2、Unit的定义
3、高阶函数的实现:
下面的gaoFun()函数的参数除了一个布尔类型的isSay以外,还有一个lambda函数作为了参数。这种函数我们就称之为高阶函数。
fun gaoFun(isSay: Boolean, lambda: () -> Unit) {
if (isSay) {
println("高阶函数的参数lambda()匿名函数传了进来")
lambda()
}
}
//main()函数的Unit就是省略的。(这里我特意加上了)
fun main(): Unit {
//这里我们将lambda匿名函数传给了gaoFun
gaoFun(false, { println("我是高阶函数") })
//因为gaoFun函数的最后一个参数是Lambda,所以我们可以将lambda匿名函数放在小括号的后面
gaoFun(true) { println("我也可以放在这里") }
/**
* 这里我声明了一个Runnable匿名内部类,然后将匿名内部类的run匿名函数赋值给了lambda
*/
val runnable = Runnable {
println("我是一个Runnable,我在被copy的时候就会运行")
}
val lambda: () -> Unit
lambda = runnable::run
gaoFun(true, lambda)
}
4、inline定义
inline---内联函数
当我们在使用高阶函数的时候,因为除了高阶函数本身是个函数以外,它的参数或者返回值也是一个Lambda函数,lambda函数内部还有局部变量,当在编译运行的时候,因为每一个Lambda函数都是一个对象,并且还会捕获一个闭包及闭包内会访问到的变量。 这样在内存分配(对于函数对象和类)和虚拟机调用上都会加大运行时间开销。
为了解决高阶函数所带来的额外开销,kotlin加入了inline关键字。
注意:过多的使用inline关键字会对编译器造成很大的性能压力,所以我们建议只在高阶函数中使用inline关键字。
5、inline 原理
代码在编译以后,会将内联函数的函数体复制到调用处。
下面左边是我们的inline函数,右边是我们编译后的class文件。
从编译后的class可以看出,inline的函数体会被直接复制到调用该内联函数的地方。
6、如何在AndroidStudio中查看kotlin编译后的class源码
第一步:选择你要查看你的kotlin文件,然后点击Tools-->Kotlin-->Show Kotlin Bytecode
第二步:点击左上角的 Decompile 按钮就会弹出你想要的class源码