Kotlin作用域函数全解析:let、run、apply、also
- Kotlin作用域函数全解析:let、run、apply、also
- let
- run
- apply
- also
- 对比示例
Kotlin作用域函数全解析:let、run、apply、also
作用域函数就是为对象开辟一个临时作用域,简化代码,避免重复写对象名,一共 4 个核心,核心区分看两点:
- 接收参数:
it还是this - 返回值:
lambda结果还是对象本身
| 函数 | 内部引用对象 | 返回值 | 典型用途 |
|---|---|---|---|
let | it | lambda 最后一行结果 | 空安全处理,对象转换 |
run | this | lambda 最后一行结果 | 对象内部操作 + 返回计算结果 |
apply | this | 原对象本身 | 对象初始化,批量设置属性 |
also | it | 原对象本身 | 附加额外操作,日志、调试 |
let
- 内部访问对象:it
- 返回:lambda 表达式的返回值(最后一行)
- 最常用:
?.let做空安全
valstr:String?="hello"vallen=str?.let{println(it.length)// it 代表str,非空it.length// 返回值给到 len}// str为null,整个let不执行,len=null适用场景:
- 可空对象安全调用
- 需要把对象转成另一个值
❗内部是
it,不能直接访问属性,要it.xxx
run
- 内部访问对象:this(可以省略 this)
- 返回:lambda 最后一行结果
- 兼具 apply + let 的部分特性
valresult="abc".run{// this 是字符串,可以省略length+10}println(result)// 13// 空安全 runvalstr:String?="kotlin"valres=str?.run{uppercase()// this.uppercase()}适用:对对象做一系列计算,需要返回计算结果,直接访问对象属性方法(this 省略)
和 let 区别:
run用this,let用it
apply
- 内部访问对象:this(可省略)
- 返回:原对象本身!!最常用于对象构建、批量赋值
dataclassUser(varname:String="",varage:Int=0)valuser=User().apply{name="张三"age=20}// apply返回自己,直接赋值给user链式调用很舒服,初始化实例首选 apply。
返回对象本身,所以可以链式继续调用对象方法。
also
- 内部访问对象:it
- 返回:原对象本身
vallist=mutableListOf<Int>().also{it.add(1)it.add(2)println(it)// 打印日志}// also返回list对象典型场景:做附加操作:打印日志、调试、埋点,不改变对象,做完操作继续把对象往下传。
和 apply 对比:
apply:this,适合修改对象属性
also:it,适合额外的附带操作
对比示例
valobj="test"vala=obj.let{it.length}// it,返回4valb=obj.run{length}// this,返回4valc=obj.apply{println(this)}// this,返回"test"vald=obj.also{println(it)}// it,返回"test"