高阶函数的注意事项
高阶函数的定义
函数(or lambde) 的参数又是 函数(or lambde),这样的函数我们称之为高阶函数
fun main(args: Array<String>) {
onlyif(true){
println("print log")
}
}
fun onlyif(isDebug: Boolean, block:() -> Unit){
if (isDebug) block()
}
在 kotlin 中,函数是 “一等公民”
val runnable = Runnable {
println("as")
}
val function: () -> Unit//声明一个参数为空的函数对象
function = runnable::run//可以这样去直接引用函数声明
注意
在高阶函数的参数中,要想作为参数传递给高阶函数的时候,必须得要是传递函数的声明,如果传的是直接执行一个函数的话,那么实际上传递的是函数的返回值
上面的代码直接跑是不打印 as
的,改成如下形式就好了:
fun main(args: Array<String>) {
val runnable = Runnable {
println("as")
}
val function: () -> Unit
function = runnable::run
onlyif(true, function)
}
inline fun onlyif(isDebug: Boolean, block:() -> Unit){
if (isDebug) block()
}
用内联优化代码
-
Kotlin 的 Lambda 表达式会被编译成是一个匿名对象的形式
- 如果代码中有大量重复的 lambda 表达式,代码会生成很多临时的无用对象
-
可以使用 inline 关键字去修饰高阶函数,这样当方法在编译时就会拆解函数的调用语句为语句调用,进而减少创建不必要的对象
-
过度使用 inline 关键字,会增加编译器的编译的负担,同时会使代码块变的很庞大,查找起问题很麻烦,所以 inline 通常只会用于修饰高阶函数
public final class TestKt {
public static final void main(@NotNull String[] args) {
onlyif(true, (Function0)null.INSTANCE);
}
public static final void onlyif(boolean isDebug, @NotNull Function0 block) {
if (isDebug) {
block.invoke();
}
}
}
使用 inline 关键字后,代码变成类似下面这种: