<本文学习郭神《第三行代码》总结>
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)