1. What
Scope Functions: 作用域函数, Kotlin 标准库函数,
目的是在上下文对象内执行一段代码块, 该代码块是以 lambda 表达式的形式,不需使用该对象的名字访问它本身。
(并没有引入新的技术,只是在代码上更简洁)
有五种:let, run, with, apply, aslo
1.1 上下文对象访问方式: this, it -- 推荐使用场景
this: 在需要调用成员方法, 或者给成员变量赋值时 (可以省略 this)
it: 在函数调用里,对象需要作为一个参数时,另外在作用域内可以给上下文对象自定义一个变量名 (it 比this 短且方便理解)
1.2 返回值
取决于下一步你需要执行什么样的操作。
上下文对象 : 对同样的一个对象 执行 链式调用
lambda表达式结果: 返回最后执行的作为结果,给变量赋值; 也可以忽略返回值
2. How
根据对上下文对象的访问方式, 返回值, 以及是否为拓展函数, 区分使用场景
函数 | 上下文对象访问方式 | 返回值 | 是否为拓展函数 | 使用场景 |
let | it | lambda表达式结果 | 是 | 对非空对象执行操作 |
run | this | lambda表达式结果 | 是 | 对象配置并且计算结果 |
run | - | lambda表达式结果 | 否:没有调用上下文对象 | 执行声明作为一个表达式 |
with | this | lambda表达式结果 | 否:把上下文对象作为参数 | 分组功能调用 |
apply | this | 上下文对象 | 是 | 对象配置 |
also | it | 上下文对象 | 是 | 附加的操作 |
3. takeIf 和 takeUnless
takeIf : 满足条件 即返回对象本身,否则返回空 (null)
takeUnless: 不满足条件下 返回对象本身, 否则返回空 (null)
作用: 方便链式调用, 与作用域函数配合使用, 常见为 与 ?.let 配合使用 (需要做安全检查)