前介
在 Kotlin
中提供了一种扩展函数,功能尤为的强大。又为我们提供了 Lambda
表达式,简化我们的开发。在这些基础上 Kotlin
为我们提供了一系列的作用域函数(本质上还是通过扩展函数实现 + Lambda
实现的)。
作用域函数
什么是作用域函数呢?我的理解就是所有的对象,都可以使用这些函数来简化我们的操作,减少中间变量的创建,让我们的功能可以链式方式实现。(纯属个人理解)
常见的作用域函数
接下来我们看看 Kotlin
为我们提供了那些常用的作用域函数呢?又有和区别呢?
run 操作符
run
操作符的的功能,对应 Lambda
表达式中的 this
就是作用域对象。返回值是 Lambda
表达式的返回值。看完这句话是不是一头雾水呀?大家直接看代码吧!
fun main() {
val data = Data("阿文", 18)
val reslut = data.run {
name = "阿文2"
"修改完成"
}
println(reslut)
println(data.name)
}
输出结果:
修改完成
阿文2
代码中我调用 data
对象的 run
方法,且传入了一个 Lambda
表达式,且在 Lambda
表达式中直接访问和修改了 data
的 name
属性,最后 Lambda
表达式的返回值是 修改完成
。(思考为何 Lambda
表达式能直接访问 data
对 象的属性呢?)
想不到?那我们看下源码吧。
public inline fun <T, R> T.run(block: T.() -> R): R {
。。。
return block()
}
可以看到 run
方法的本质是通过扩展函数来实现的(所有的作用域函数都是通过扩展函数来实现)。首先通过定义了 2
个泛型 <T, R> 且没有加任何类型约束,也就是说任何类型都可以调用,对应 T
是作用域对象,R
是输出类型。
注意传入的 Lambda
表达式,又是一个 T
扩展函数(这就是为啥 Lambda
能直接访问作用域对象的属性原因),且 Lambda
表达式返回值的是 R
类型。
接下来看看函数体,就一句关键代码,调用了传入的 Lambda
表达式。且整个 run
函数,返回了 Lambda
的返回结果。
let 操作符
let
操作符,对应传入 Lambda
表达式的 it
对象就是作用域对象( it
代表的是 Lambda
第一个参数,Lambda
表达式篇中讲过哦),返回值是 Lambda
表达式的返回值。
fun main() {
val data = Data(&#