第八章:高阶函数:Lambda作为形参和返回值

声明高阶函数

  1. 高阶函数定义:是以另外一个函数作为参数或者返回值的函数;在Kotlin中可以用lambda或者函数引用来表示函数;

  2. 任何以lambda或者函数引用作为参数的函数,或者返回值为lambda或者函数引用的函数或者两者都满足的函数都是高阶函数;

  3. 声明函数类型:需要把函数参数类型放在括号中,紧接着是一个箭头和函数的返回类型(函数类型声明总是需要一个显式的返回类型,Unit类型的返回值不可忽略)

  4. 函数类型的返回值可以被标记为空,函数类型也可以为空,函数类型的参数名称不会影响类型的匹配;
    在这里插入图片描述
    在这里插入图片描述

  5. 在Java中使用函数类:Java 8中的lambda会被自动转换成函数类型的值;可以传递一个实现呢函数接口中的invoke方法的匿名类的实例(Java中使用函数类的原理是:函数类型被声明为普通的接口:一个函数类型的变量是FunctionN接口的一个实现,Kotlin标准库中定义了一系列的接口,Function0 没有参数的函数、Function1<P1, R> 一个参数的函数。。。每个接口都定义了一个Invoke方法)
    在这里插入图片描述

  6. 函数类型的默认值:把lambda作为值放在=后

FunName : (Params...) -> Type = {...}
  1. 返回函数的函数:声明一个返回另一个函数的函数,需要指定一个函数类型作为返回类型
    在这里插入图片描述

内联函数:销除lambda带来的运行开销

  1. 使用inline 时,它的函数体是内联的——函数体会直接替换到函数被调用的地方
  2. 内联函数的限制:如果lambda参数在某个地方被保存起来,以便后面可以继续使用,lambda表达式的代码将不会被内联
  3. 接收非内联lambda参数:noinline
  4. 决定如何将函数声明为内联:使用inline关键字只能提高带有Lambda参数的函数的性能
  5. 使用内联lambda管理资源:Kotlin标准库提供了叫作withLock的函数,它是Lock的扩展函数,实现加锁的功能(synchronized函数)
    在这里插入图片描述
    use函数:是一个扩展函数,被用来操作可关闭的资源,它接收一个lambda作为参数,这个方法调用lambda并且确保资源被关闭,不管lambda是正常执行还是抛出异常
  6. 对于普通函数的调用,JVM已经提供了强大的内联支持,它会分析代码的执行,并在任何通过内联能够带来好处的时候将函数调用内联,所以使用inline大多是在lambda表达式且符合内联条件。

高阶函数中的控制流

  1. 非局部返回:在lambda中使用关键字return,它会从调用lambda的函数中返回,并不只是从lambda中返回。条件:只有在以lambda作为参数的函数是内联函数的时候才能从更外层的函数返回。
  2. 从lambda返回(局部返回):终止lambda的执行,并接着从调用lambda的代码处执行,使用标签实现。使用:在lambda的花括号之前放一个标签名(可以是任何标识符),接着放一个@符号,从lambda返回,在return关键字后放一个@符号加标签名。
    在这里插入图片描述
    或者使用lambda作为参数的函数的函数名可以作为标签。
    在这里插入图片描述
    注意:一个lambda的表达式的标签不能多于一个;
  3. 匿名函数默认使用局部返回:return从最近使用fun关键字声明的函数返回;匿名函数是省略了函数的名字以及参数的类型
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值