kotlin 之几个常见的内联函数(四)

内联函数,上面三篇文章,分别讲了let、with、run,这三个使用上大同小异,平时在开发中比较容易用错,虽然不会造成多大的影响,但是最好还是在合适的地方使用合适的方法,这是最好的,

上一篇文章讲了run,链接如下,有兴趣的同学可以去看看

kotlin 之几个常见的内联函数(三)_水很清的博客-CSDN博客

这篇文章讲apply 函数,从apply开始,到后面的also,就有些不同了, 具体哪些不同呢,往下看吧

apply函数

一、函数结构为

public inline fun  T.apply(block: T.() -> Unit): T { block(); return this }

从结构上可以看出,apply与let、with、run不同了,它没有R类型,它是对原始数据T操作处理后再将T返回。

二、一般使用结构:

object.apply{
//todo
}

与run 类似

三、apply函数底层的inline扩展函数+lambda结构

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

四、函数结构分析

从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身。

五、举个栗子

fun main(args: Array<String>) {
    val user = User("Kotlin", 1, "1111111")
    val result = user.apply {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }
    println("result: $result")
}

代码分析:apply使用方式跟run一样,不同的是返回值,如果是run,这时result=1000,但此时是apply,result=user,说白了就是apply对user进行一番操作后,再将user返回。

六、kotlin 与 java的代码对比

//kotlin
fun main(args: Array<String>) {
    val user = User("Kotlin", 1, "1111111")
    val result = user.apply {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }
    println("result: $result")
}
 
//java
public final class ApplyFunctionKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      User user = new User("Kotlin", 1, "1111111");
      String var5 = "my name is " + user.getName() + ", I am " + user.getAge() + " years old, my phone number is " + user.getPhoneNum();
      System.out.println(var5);
      String var3 = "result: " + user;
      System.out.println(var3);
   }
}

七、使用场景

整体作用功能和run函数很像,唯一不同点就是它返回的值是对象本身,而run函数是一个闭包形式返回,返回的是最后一行的值。正是基于这一点差异它的适用场景稍微与run函数有点不一样。apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到,这种情景非常常见。特别是在我们开发中会有一些数据model向View model转化实例化的过程中需要用到。

以上就是apply,下一篇是also,that's all.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值