函数的作用:在连续调用同一个对象的多个方法时让代码变得更加精简
比如:有一个水果列表,我们想吃完所有水果,并且打印出结果:
通常的写法:
fun fruit1(){
val list= listOf("apple","orange","pear","grape")
val builder =StringBuilder()
builder.append("start eating fruit.\n")
for (fruit in list){
builder.append(fruit).append("\n")
}
builder.append("eat all fruits.")
val result=builder.toString()
println(result)
}
打印结果:
start eating fruit.
apple
orange
pear
grape
eat all fruits.
1.with函数:
仔细观察以上代码发现:我们连续调用了很多次builder,其实这个时候就考虑用with函数让代码变得更加精简,with的第一个参数传入了StringBuilder对象,接下来不再重复调用builder.append和builder.toString(),而是直接调用append和toString()方法。Lambda表达式会作为with函数的返回值返回
示例:
val result=with(obj){
//这是obj上下文
"value" //with函数的返回值
}
fun fruit2(){
val list= listOf("apple","orange","pear","grape")
val result= with(StringBuilder()){
append("start eating fruit.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("eat all fruits.")
toString()
}
println(result)
}
打印结果:
start eating fruit.
apple
orange
pear
grape
eat all fruits.
2.run函数:
run函数和with函数的使用非常相似,run函数通常不会直接调用,而是在某个对象的基础上调用;run函数直接收一个Lambda参数,并在Lambda表达式中提供调用对象的上下文。
示例代码:
val result=obj.run{
//这里时obj的上下文
"value" //这是run函数的返回值
}
fun fruit3(){
val list= listOf("apple","orange","pear","grape")
val result=StringBuilder().run{
append("start eating fruit.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("eat all fruits.")
toString()
}
println(result)
}
打印结果:
start eating fruit.
apple
orange
pear
grape
eat all fruits.
3.apply函数:
apply函数和run函数及其类似,都是在某个对象上调用,并且直接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是直接调用对象本身
val result=obj.apply{
//这是obj的上下文
//result==obj
}
fun fruit4(){
val list= listOf("apple","orange","pear","grape")
val result=StringBuilder().apply{
append("start eating fruit.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("eat all fruits.")
}
println(result.toString())
}