一、几个作用域函数

作用域函数 对象引用 返回值 是否扩展函数
let it Lambda result Yes
run this Lambda result Yes
run - Lambda result No:called without the context object
with this Lambda result No:takes the context object as an argument.
apply this Context object Yes
also it Context object Yes

这些作用域函数让 Kotlin 编程变得更简单,当然,副作用就是可能不太好理解。作用域函数本质上是类似的:在对象上执行代码块。每个作用域函数之间有两个主要区别:

  • 它们引用上下文对象的方式。
  • 它们的返回值,即表达式的结果。

各个函数的作用简洁描述如下:

  • run:对象配置和计算结果,lambda 接受 this 关键字,返回 lambda 结果
  • non-extension run:在需要表达式的情况下运行语句,lambda 接受 this 关键字,返回 lambda 结果
  • with:对对象的函数调用进行分组,lambda 接受 this 关键字,返回 lambda 结果
  • apply:对象配置/对象填充,lambda 接受 this 关键字,返回上下文对象
  • let: 在不可为 null 的对象上执行 lambda,并返回最后一条语句;将表达式作为局部作用域中的变量引入,作用域默认 it 变量,返回 lambda 结果
  • also:附加效果,作用域默认 it 变量,返回上下文对象
  • 在访问接收方对象的成员 this 时可以省略,从而使代码更短
  • 除了上面写的几个函数,Kotlin 标准库中还有其它作用域函数

let

let 将 调用对象 作为参数,并返回 lambda 表达式的结果。Kotlin let 是一个范围函数,表达式内部声明的变量不能在外部使用。it 是 let 中的一个默认的属性。如下所示,let 中的最后一个值将作为参数返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fun main(args: Array<String>) {
val str = "Kotlin is so simple!"
val length = str.let {
println("$it!!")
it.length
}
println("${str.length}: $length")

val a = 10
val b = 20
val result = a.let { a + b }.let { it + 1 }
println("result is $result")
}

// Kotlin is so simple!!!
// 20
// result is 31

also

also:顾名思义,also 表达式会对被调用的对象进行一些额外的处理。与 let 不同的是,它返回的是 原始对象。与 let 一样,代码块中也使用 it。

1
2
3
4
5
6
7
8
9
10
fun main(args: Array<String>) {
val a = 10
val b = 20
val result = a.also {
it + b + 5
}
println("result is $result")
}

// result is 10

run

  • 与 let 函数类似,run 函数也返回最后一条语句。
  • 与 let 不同,run 函数 不支持 it 关键字。

apply

apply 是类型的扩展函数。它在表达式中的对象引用(也称为接收器)上运行,并在完成时返回对象引用。

with

与 apply 一样,with 用于更改实例属性,而无需每次都在引用上调用 . 运算符。

  • with 运行不需要对象,而 apply 需要;
  • apply 在对象引用上运行,而 with 只是将其作为参数传递;
  • with 函数的最后一个表达式返回结果。

use 自动关闭资源

除了以上几种作用域,Kotlin 常用的还有一个 use 作用域块(当然还可以自定义更多)。该作用域函数和 Java 中的 try-resource 有者同样的作用。


本站由 江湖浪子 使用 Stellar 1.28.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。