apply also返回自身对象
let with run 都是单纯一个作用域,返回的是lambda表达式
let
let
可用于在调用链的结果上调用一个或多个函数,或者说基于代码的结果再执行相关逻辑
tabList?.let {
it:ArrayList<Tab> ->
createWebView(tabList)
}
//tabList不为null,就执行逻辑
it参数:it代表表达式的结果,可以基于结果做下一步操作。it也可以修改为其他标识
let
经常用于仅使用非空值执行代码块
with
with
可以理解为“对于这个对象,执行以下操作。” this关键字代表自身对象。
一个对象的一组函数调用 使用with
with(menuView) {
this.setMenuData(tabList!!)
}
还可以返回一个属性或者函数,然后被执行
val name = with(view){ this:MenuView->
"name"
}
println(name)
run
run
和 with
做同样的事情,但是调用方式和 let
一样。个人认为主要强调返回值的使用
1.对象配置并且计算结果
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
2.在需要表达式的地方运行语句:非扩展的run
扫描二维码关注公众号,回复:
13590844 查看本文章
除了在接收者对象上调用 run
之外,还可以将其用作非扩展函数。 非扩展 run
可以使你在需要表达式的地方执行一个由多个语句组成的块。
fun main() {
//此处run返回一个对象,且初始化对象并返回
val hexNumberRegex = run {
val digits = "0-9"
val hexDigits = "A-Fa-f"
val sign = "+-"
Regex("[$sign]?[$digits$hexDigits]+")
}
for (match in hexNumberRegex.findAll("+1234 -FFFF not-a-number")) {
println(match.value)
}
}
apply
主要应用于对象的配置,返回对象自身
val adam = Person("Adam").apply { this->
age = 32
city = "London"
}
println(adam)
also
参数为it,返回自身对象
val numbers = mutableListOf("one", "two", "three")
numbers.also {
println("The list elements before adding new one: $it") }
.add("four")