Android-Daily-Interview
Android-Daily-Interview copied to clipboard
2019-08-07:请举例说明Kotlin中with与apply函数的应用场景和区别?
看源码知区别,为了方便我只使用apply和let这两个函数,从来不用with,因为不能防空 apply:返回自身,this指代 let:返回最后一行,it指代 with类似let
with:with函数会把它的第一个参数装换成作为第二个参数传给它的lambda的接收者,可以通过this来访问这个接收者。with返回的是执行lambda代码的结果。 apply:apply函数基本与with一致,但是apply返回的是接收者对象。
with 不怎么使用,因为它确实不防空;
经常使用的是 run 和 apply
run闭包返回结果是闭包的执行结果;apply返回的是调用者本身。- 使用上的差别:
run更倾向于做一些其他复杂逻辑操作,而apply更多的是对调用者自身配置。 - 大部分情况下,如果不是对调用者本身进行设置,我会使用
run。
apply:返回自身用this代指 let:返回最后一行 It代指 with:会把它的第一个参数装换成第二个参数传给它的接受者,通过this来访问但它不防空,所以很少用
with:适用于调用同一个类的多个方法时,可以省去类名重复,直接调用;类的方法即可。
apply:具有with的功能,并且可以判空,同时返回对象本身
| 函数名 | 函数块内使用对象 | 返回值 | 是否扩展函数 | 适用场景 |
|---|---|---|---|---|
| apply | this | 自身 | 是 | 适用于run()函数的任何场景,通产可用来在初始化一个对象实例时,操作对象属性并最终返回该对象。也可用于多个扩展函数链式调用 |
| also | it | 自身 | 是 | 适用于let()函数的任何场景,一般可用于多个扩展函数链式调用 |
| let | it | lambda最后行 | 是 | 适用于对象统一处理不为空的情况 |
| run | this | lambda最后行 | 是 | 适用with()、let()函数的任何场景 |
| with | this | lambda最后行 | 否 | 适用于调用同一个类多个方法 |