Moosphan/Android-Daily-Interview

2019-08-07:请举例说明Kotlin中with与apply函数的应用场景和区别?

Moosphan opened this issue · 6 comments

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 不怎么使用,因为它确实不防空;
经常使用的是 runapply

  1. run 闭包返回结果是闭包的执行结果;apply 返回的是调用者本身。
  2. 使用上的差别:run 更倾向于做一些其他复杂逻辑操作,而 apply 更多的是对调用者自身配置。
  3. 大部分情况下,如果不是对调用者本身进行设置,我会使用 run

apply:返回自身用this代指
let:返回最后一行 It代指
with:会把它的第一个参数装换成第二个参数传给它的接受者,通过this来访问但它不防空,所以很少用

XJ-Up commented

with:适用于调用同一个类的多个方法时,可以省去类名重复,直接调用;类的方法即可。

apply:具有with的功能,并且可以判空,同时返回对象本身

函数名 函数块内使用对象 返回值 是否扩展函数 适用场景
apply this 自身 适用于run()函数的任何场景,通产可用来在初始化一个对象实例时,操作对象属性并最终返回该对象。也可用于多个扩展函数链式调用
also it 自身 适用于let()函数的任何场景,一般可用于多个扩展函数链式调用
let it lambda最后行 适用于对象统一处理不为空的情况
run this lambda最后行 适用with()、let()函数的任何场景
with this lambda最后行 适用于调用同一个类多个方法