持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
前言
上一篇我们了解了比较常用的let,接下来让我们一起了解剩下的作用域函数。
also
上下文对象可用作参数 ( it)。返回值是对象本身。
let函数与also函数的主要作用非常相似,唯一不同的就是返回值,also返回对象本身而let返回其lambda块中的最后一行。
private var x:Int = 2
fun main() {
val result = getValue()
println("计算值是: $result")
}
fun getValue() = ( x * x).also {
it + 5
}
// 输出:计算值是:4
这里由于also函数返回值是对象本身,所以返回值是4,而不是9,如果我们在aslo函数内添加一行日志来打印it+5,那么输出结果就是9。
apply
上下文对象可用作接收器 ( this)。返回值是对象本身。将 apply 用于不返回值的代码块,常见的情况apply是对象配置。
val intent = Intent().apply {
putExtra("name","xxxxxx")
putExtra("age","18")
action = Intent.ACTION_VIEW
}
现在在里面apply我们得到了一个this引用,所以我们可以直接调用对象方法而不用it引用 Intent 对象。
apply当你有一个对象并且这些对象属性变化更多时非常方便。
run
上下文对象可用作接收器 ( this)。返回值是 lambda 结果。run它相当于apply这里的主要区别是apply返回对象本身,但run它返回其块的最后一行或lambda结果。
val intent = Intent().run {
putExtra("name","xxxxxx")
putExtra("age","18")
action = Intent.ACTION_VIEW
this
}
在这里,因为我们在末尾添加了this关键字,现在run块返回意图对象。
with
非扩展函数:上下文对象作为参数传递,但在 lambda 内部,它可用作接收器 ( this)。返回值是 lambda 结果。我们建议with在不提供 lambda 结果的情况下调用上下文对象上的函数。在代码中,with可以读作“使用此对象,执行以下操作。”
val numbers = mutableListOf(1,2,3)
with(numbers) {
println("'with'函数调用$this")
}
总结
| 函数名 | 作用 | 应用场景 | 备注 |
|---|---|---|---|
| let | 1. 定义一个变量在特定作用域内 2. 统一做空校验 | 1. 明确一个变量所处特定的作用域范围内可用。 2. 正对一个可空对象统一空校验 | 返回值=最后一行/return表达式 |
| also | 1. 定义一个变量在特定作用域内 2. 统一做空校验 | 1. 明确一个变量所处特定的作用域范围内可用。 2. 正对一个可空对象统一空校验 | 返回值=传入的对象 |
| apply | 1. 定义一个变量在特定作用域内 2. 统一做空校验 | 对象实例初始化时需要对对象的属性进行赋值并且返回该对象 | 返回值=传入的对象 |
| run | 1. 定义一个变量在特定作用域内 2. 统一做空校验 | 1. 调用同一个对象的多个方法或属性,可以省去对象名的书写。 2. 定义一个变量在特定作用域内 3. 统一空校验 | 返回值=最后一行/return表达式 |
| with | 调用同一个对象的多个方法或属性,可以省去对象名的书写 | 调用同一个对象的多个方法或属性, | 返回值=最后一行/return表达式 |