<本文學習郭神《第三行代碼》總結>
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)