run、with 以及 apply 通过关键字 this 引用上下文对象。
let 及 also 将上下文对象作为 lambda 表达式参数。
— 返回值
根据返回结果,作用域函数可以分为以下两类:
apply 及 also 返回上下文对象。
let、run 及 with 返回 lambda 表达式结果.
Let的使用:
Let可以用于判空操作,比如:
//java
if(a!=null){
.....
}
//kotlin
a?.{
......
}
以上这样就可以省去if判断。
除此之外,let括号内it表示该对象,在let内执行对象操作时,it不可省去
fun main(){
var a=AAA()
var x1=a.let {
it.m1()
it.m2()
it.s
}
}
class AAA{
var s:String="111"
fun m1(){
print("m1\n")
}
fun m2(){
print("m2\n")
}
}
with的使用
跟let差别不多,with用this表示操作对象,在作用域内,this可以省去
fun main(){
var a=AAA()
with(a){
m1() //this.m1()
m2() //this.m2
s //this.s
}
}
class AAA{
var s:String="111"
fun m1(){
print("m1\n")
}
fun m2(){
print("m2\n")
}
}
run的使用
run的用法其实和let差不多,就是把it换成了this
fun main(){
var a=AAA()
a.run {
m1()//this.m1()
}
}
class AAA{
var s:String="111"
fun m1(){
print("m1\n")
}
fun m2(){
print("m2\n")
}
}
apply的使用
返回的对象时AAA()这个类的对象实例
fun main(){
var a=AAA().apply {
m1()
s
}
println(a)
}
class AAA{
var s:String="111"
fun m1(){
print("m1\n")
}
fun m2(){
print("m2\n")
}
}
also的使用
返回的对象时AAA()这个类的对象实例
fun main(){
var a=AAA().also {
it.m1()
it.s
}
println(a)
}
class AAA{
var s:String="111"
fun m1(){
print("m1\n")
}
fun m2(){
print("m2\n")
}
}