kotlin 作用域函数let、also、apply、run、with(二)

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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") 
}

总结

函数名作用应用场景备注
let1. 定义一个变量在特定作用域内 2. 统一做空校验1. 明确一个变量所处特定的作用域范围内可用。 2. 正对一个可空对象统一空校验返回值=最后一行/return表达式
also1. 定义一个变量在特定作用域内 2. 统一做空校验1. 明确一个变量所处特定的作用域范围内可用。 2. 正对一个可空对象统一空校验返回值=传入的对象
apply1. 定义一个变量在特定作用域内 2. 统一做空校验对象实例初始化时需要对对象的属性进行赋值并且返回该对象返回值=传入的对象
run1. 定义一个变量在特定作用域内 2. 统一做空校验1. 调用同一个对象的多个方法或属性,可以省去对象名的书写。 2. 定义一个变量在特定作用域内 3. 统一空校验返回值=最后一行/return表达式
with调用同一个对象的多个方法或属性,可以省去对象名的书写调用同一个对象的多个方法或属性,返回值=最后一行/return表达式