0
点赞
收藏
分享

微信扫一扫

kotlin 高阶函数的注意事项


高阶函数的注意事项

  • ​​高阶函数的定义​​
  • ​​在 kotlin 中,函数是 "一等公民"​​
  • ​​注意​​
  • ​​用内联优化代码​​

高阶函数的定义

函数(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 关键字后,代码变成类似下面这种:

kotlin 高阶函数的注意事项_函数声明


举报

相关推荐

0 条评论