带接收者的lambda:“with”与“apply”
在lambda函数体内可以调用一个不同对象的方法,无序借助任何额外的限定符,这样的lambda叫做带接收者的lambda。
1.1、with函数
fun alphabet():String{
val resul = StringBuffer()
return with(StringBuffer){
for(letter in 'A'..'Z'){
this.append(letter) //通过显示的this来调用接收者值的类型
}
append("\nNow I Konw the alphabet")//可以省略this
this.toString() //从lambda返回值
}
}
with实际上接收了两个参数的函数。with函数把它的第一个参数转换成作为第二个参数传递给它的lambda的接收者。this指向了stringBuilder,这是传给with的第一个参数。可以通过显示的this引用来访问stringBuilder的方法。
fun alphabet() = with(StringBuffer()){ //重构
for(letter in 'A'..'Z'){
append(letter)
}
append("\nNow I Konw the alphabet")//可以省略this
toString() //从lambda返回值
}
1.2、apply函数
apply函数和with函数几乎一模一样。唯一区别apply始终会返回作为实参数传递给他的对象(返回接收者对象)
fun alphabet() =StringBuilder().apply{
for(letter in 'A'..'Z'){
append(letter)
}
append("\nNow I Konw the alphabet")//可以省略this
} .toString() //从lambda返回值
apply 被声明成一个扩展函数。它的接收者变成了作为实参的lambda的接收者(即StringBuilder被传入lambda中)。执行apply的结果为StringBuilder。
buildString的实参也是一个带接收者的lambda,其接收者就是StringBuilder
fun alphabet() =buildString{
for(letter in 'A'..'Z'){
append(letter)
}
append("\nNow I Konw the alphabet")//可以省略this
}