1.let
仅当调用对象不为 null 时执行
代码语言:javascript复制name?.let {
println("name: $it")
it.fun1() // 不需要: 判空 或 ?.
it.fun2()
it.fun3()
} // 最后一行为返回值
2.also
跟 let 类似,但返回的是传入对象本身
代码语言:javascript复制val result = name?.also {
// do something
} // 返回 name
3.with
调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
代码语言:javascript复制with(person) {
println("name:${name}") // name:null
}
4.run
代码语言:javascript复制person.run {
name = "momo"
age = 2
}
5.apply
跟 run 类似,不过返回的是传入对象本身
代码语言:javascript复制val person = Person().apply {
name = "John"
age = 25
} // 返回初始化好的对象
6.总结对比
作用域函数 | 是否判空 | 参数 | 返回值 | 扩展函数 | 说明 |
---|---|---|---|---|---|
let | 判空 | it | 最后一行 | 是 | 减少频繁判空 |
also | 判空 | it | 返回this | 是 | 对对象执行操作后返回 |
with | 不判空 | this指代当前对象/省略 | 无 | 否 | 省去写对象 |
run | 判空 | this指代当前对象/省略 | 无 | 是 | 省去写对象 |
apply | 不判空 | this指代当前对象/省略 | 返回this | 是 | 常用于初始化对象 |