kotlin标准函数特点对比
标准函数名称 | 作用域中的接收者 | 返回值 |
---|---|---|
let | it | 作用域的最后一行的对象 |
run | this | 作用域的最后一行的对象 |
with | this | 作用域的最后一行的对象 |
apply | this | 调用对象本身 |
also | it | 调用对象本身 |
let与also
从上表可以看出,let与also作用域中的接收者都是it,但它们比较明显的不同在于返回值的不同。let返回值是作用域的最后一行的对象,而also返回值是调用对象本身。他们都可以在调用时对调用者进行空判断。如下所示:
println("yds"?.let{
println(it)
"whx"
})
结果:
yds
whx
println("yds"?.also{
println(it)
"whx"
})
结果:
yds
yds
问号就是对前面的调用者进行空判断,如果为空,则不会调用点后面的内容。上述不可能为空,可以去掉问号。
run与with
从上表可以看出,run与with作用域中的接收者都是this, 且返回值都是作用域的最后一行的对象,那他们的区别在哪里呢?run是通过对象调用,而with是通过传参,且run可以在调用之前进行空判断,而with则不能,代码如下:
//可进行空判断
println("yds"?.run{
println(this)
"whx"
})
结果:
yds
whx
//不可进行空判断
println(with("yds"){
println(this)
"whx"
})
结果:
yds
whx
run与apply
从上表可以看出,run与apply作用域中的接收者都是this, 但他们明显的不同在于run返回的是作用域最后一行的对象,而apply返回的是调用者本身。
println("yds"?.run{
println(this)
"whx"
})
结果:
yds
whx
println("yds"?.apply{
println(this)
"whx"
})
结果:
yds
yds