“with”函数
要想了解"with"函数先来看一段代码
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()
}
}
复制代码
运行结果
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
复制代码
通过上面代码可以看出,运行结果一样,但是alphabet()是最常规的写法, alphabetWith()方法则运用了今天的重点讲解的函数with()函数
wtih结构看起来像一种特殊的语法结构,但它是一个接收两个参数的函数:参数分别是stringBuffer和一个lambda
with函数把它的第一个参数转换成第二个参数传给它的lambda的接收者,可以显示地通过this引用来访问这个接收者,但是上述方法alphabetWith()方法的this是可以省略的。
with返回的值是lambda代码的返回值结果
"apply"函数
同时想了解apply函数先看一段代码
fun alphabetApply():String=StringBuffer().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\n Now I know the alphabet")
}.toString()
复制代码
执行结果:
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被声明成一个扩展函数,它的接受者变成作为实参的lambda的接受者。执行apply的结果就是StringBuffer
总结:
- with返回的值是执行lambda代码的结果,该结果是lambda中的最后一个表达式的值。
- apply返回的值是lambda接受者的对象
后记
摘自《Kotlin实战》