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 关键字后,代码变成类似下面这种:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值