“with”函數(shù)
要想了解"with"函數(shù)先來看一段代碼
fun alphabet(): String {
var stringBuilder = StringBuilder()
for (letter in 'A'..'Z') {
stringBuilder.append(letter)
}
stringBuilder.append("\n Now I know the alphabet!")
return stringBuilder.toString()
}
fun alphabetWith(): String {
var stringBuilder = StringBuilder()
return with(stringBuilder) {
for (letter in 'A'..'Z') {
this.append(letter) //this代表stringBuilder
}
this.append("\n Now I know the alphabet")
this.toString()
}
}
運行結(jié)果
08-26 15:20:58.516 24082-24082/com.troll4it.kotlindemo I/System.out: alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:20:58.517 24082-24082/com.troll4it.kotlindemo I/System.out: Now I know the alphabet!
alphabetWith:ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:20:58.518 24082-24082/com.troll4it.kotlindemo I/System.out: Now I konw the alphabet
通過上面代碼可以看出,運行結(jié)果一樣嘉赎,但是alphabet()是最常規(guī)的寫法图谷, alphabetWith()方法則運用了今天的重點講解的函數(shù)with()函數(shù)
wtih結(jié)構(gòu)看起來像一種特殊的語法結(jié)構(gòu)蔗崎,但它是一個接收兩個參數(shù)的函數(shù):參數(shù)分別是stringBuffer和一個lambda</br>
with函數(shù)把它的第一個參數(shù)轉(zhuǎn)換成第二個參數(shù)傳給它的lambda的接收者,可以顯示地通過this引用來訪問這個接收者促绵,但是上述方法alphabetWith()方法的this是可以省略的。</br>
with返回的值是lambda代碼的返回值結(jié)果
"apply"函數(shù)
同時想了解apply函數(shù)先看一段代碼
fun alphabetApply():String=StringBuffer().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\n Now I know the alphabet")
}.toString()
執(zhí)行結(jié)果:
08-26 15:50:48.888 25155-25155/com.troll4it.kotlindemo I/System.out: alphabetApply:ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:50:48.889 25155-25155/com.troll4it.kotlindemo I/System.out: Now I konw the alphabet
apply被聲明成一個擴展函數(shù),它的接受者變成作為實參的lambda的接受者败晴。執(zhí)行apply的結(jié)果就是StringBuffer
總結(jié):
- with返回的值是執(zhí)行l(wèi)ambda代碼的結(jié)果浓冒,該結(jié)果是lambda中的最后一個表達式的值。
- apply返回的值是lambda接受者的對象
后記
摘自《Kotlin實戰(zhàn)》