Kotlin学习路(三):标准函数with、run、apply

<本文学习郭神《第三行代码》总结>

1、with

with函数接受两个参数:
(1)第一个参数是任意类型对象
(2)第二个参数是Lambda表达式
with函数会在lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。

val result = with(obj){	//obj上下文
"value"	//with函数返回值
}

它可以再连续调用同一个对象的多个方法时让代码更简洁。
比如,打印一个集合中的数据,可以通过遍历集合,使用StringBuilder字符串拼接,然后打印。

val list5 = listOf("a", "b", "c")
val sb = StringBuilder()
for (string in list5){
    sb.append(string + "\n")
}
val result = sb.toString()
print(result)

但这里就连续多次调用了sb的方法,如果用with替换,应该怎么写呢,现在看一下吧。

val list5 = listOf("a", "b", "c")
val result = with(StringBuilder()){
    for (string in list5){
        append(string)
    }
    toString()
}
print(result)

首先给with传一个StringBuilder对象参数,那么Lambda表达式就会是StringBuilder的对象,所以在Lambda表达式中就可以直接调用append()和toString()方法,Lambda表达式最后一行代码作为with的返回值。

2、run

run函数的用法和使用场景和with类似。
它们不同的地方在于:
(1)run函数不能直接调用,需要通过调用某个对象的run函数。
(2)run函数只接收一个Lambda参数,并且会在Lambda表达式中提供对
象上下文。

val result = obj.run() {	//obj上下文
"value"	//with函数返回值
}

所以上述代码就可更改成:

val list5 = listOf("a", "b", "c")
val result1 = StringBuffer().run(){
    for (string in list5){
        append(string)
    }
    toString()
}
print(result)

只是将调用with函数并传入StringBuilder对象改成了调用StringBuilder对象的run方法。

3、apply

apply函数和run函数类似。
它们不同的地方在于:
(1)apply函数无法指定返回值

val result = obj.apply {	//obj上下文

}	//  result == obj

上述代码就可以修改为:

val list5 = listOf("a", "b", "c")
val result2 = StringBuilder().apply { 
    for (string in list5){
        append(string)
    }
}
print(result.toString())

由于apply函数无法指定返回值,只能返回对象本身,所以,这里的result实际上是StringBuilder对象,在打印时候,必须要调用toString方法才行。

所以Activity页面带参跳转时,Intent传入参数,就可以改成

val intent = Intent().apply {
putExtra("parm1", parm1)
putExtra("parm2", parm2)
}
startActivity(intent)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章