内联函数,上面三篇文章,分别讲了let、with、run,这三个使用上大同小异,平时在开发中比较容易用错,虽然不会造成多大的影响,但是最好还是在合适的地方使用合适的方法,这是最好的,
上一篇文章讲了run,链接如下,有兴趣的同学可以去看看
https://developer.aliyun.com/article/998684?spm=a2c6h.13148508.setting.14.62234f0eB0DSUl
这篇文章讲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.