一、几个作用域函数
作用域函数 | 对象引用 | 返回值 | 是否扩展函数 |
---|---|---|---|
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 | fun main(args: Array<String>) { |
also
also:顾名思义,also 表达式会对被调用的对象进行一些额外的处理。与 let 不同的是,它返回的是 原始对象。与 let 一样,代码块中也使用 it。
1 | fun main(args: Array<String>) { |
run
- 与 let 函数类似,run 函数也返回最后一条语句。
- 与 let 不同,run 函数 不支持 it 关键字。
apply
apply 是类型的扩展函数。它在表达式中的对象引用(也称为接收器)上运行,并在完成时返回对象引用。
with
与 apply 一样,with 用于更改实例属性,而无需每次都在引用上调用 .
运算符。
- with 运行不需要对象,而 apply 需要;
- apply 在对象引用上运行,而 with 只是将其作为参数传递;
- with 函数的最后一个表达式返回结果。
use 自动关闭资源
除了以上几种作用域,Kotlin 常用的还有一个 use
作用域块(当然还可以自定义更多)。该作用域函数和 Java 中的 try-resource 有者同样的作用。