美文网首页
用 Kotlin 写 Android 12—lambda 与 J

用 Kotlin 写 Android 12—lambda 与 J

作者: jkwen | 来源:发表于2021-05-24 07:42 被阅读0次

    函数式接口

    Kotlin 的 lambda 可以无缝的和 Java API 互操作,这也是必然的要求,因为混编场景肯定在现有以及未来的一段时间内是大量存在的。

    之所以可以无缝操作,源于 Java API 中随处可见这样一种接口,即只有一个抽象方法的接口,这种接口就叫做函数式接口。Kotlin 明确允许在调用含有函数式接口入参的方法时使用 lambda,来简化代码。

    所以也就有了平时在写一些控件点击事件时 IDE 会提示我们用 lambda 简化,而前面在说 object 时提到过,object 可以实现匿名内部类,相比 lambda 实现,在方法每次调用时都会创建一个新的实例,而 lambda 不会,所以更好的实现方式还是 lambda。(当然这仅针对函数式接口,对于多个抽象方法的接口还是要用 object 实现的)

    SAM 构造方法

    SAM 代表单抽象方法,SAM 构造方法可以显示的把 lambda 转成函数式接口。其实对应到 Java 实现,就是把匿名内部类变成成员变量这种形式来使用。

    本质上还是说用 lambda 可以简化函数式接口。

    还有一点比较实用,就是在 Java 的匿名内部类中,想要用 this 引用外部类实例是不行的,但在 Kotlin 的 lambda 实现里是可以的,从编译器角度看,lambda 就是一个代码块,所以打平了内外维度。

    带接受者的 lambda

    先看定义 在 lambda 函数体内可以调用一个不同对象的方法,而且无须借助任何额外限定符,这样的 lambda 叫做带接收者的 lambda

    以两个具体的库函数说明,

    • with

    with 有两个参数,第一个参数会作为第二个参数的接收者,第二个参数是个 lambda。在 lambda 函数体里能调用接收者的任何方法,所以 with 能应对这样的场景,对同一个对象执行多次操作,而不需要反复把对象名称写出来。

    with 的返回值是 lambda 函数体的执行结果,也就是最后一个表达式的值。

    • apply

    apply 只有一个参数,就是 lambda,它的接收者就是调用它的对象。同理,在 lambda 的函数体里就能调用,调用 apply 方法的对象的任何方法(有点绕,就是比如 a.apply{ lambda 函数体 },那么lambda 函数体里就能调用 a 的任何方法,且不需要使用 a. 前缀)。

    apply 的返回还是接收者,即还是 a 本身。所以和 with 函数差别并不太大。

    参考内容

    「Kotlin 实战」

    相关文章

      网友评论

          本文标题:用 Kotlin 写 Android 12—lambda 与 J

          本文链接:https://www.haomeiwen.com/subject/rewgjltx.html