let
- 在函数体内使用 it 代替调用者访问其公有的属性和方法
val person = Person("fzh", 22)
person.let {
print("name = ${it.name}")
}
- 可以对一个可能为空的对象(object?)进行判空操作
val person = getPerson()
// 如果person为null,将不会执行let块
person?.let {
print("name = ${it.name}")
}
- 返回值可以为函数的最后一行
val person = Person("fzh", 22)
val a = person.let {
it.name
}
print(a) // 输出"fzh"
also
also 的用法和 let 基本一样,区别在于 also 返回的是对象本身。
val person = Person("fzh", 22)
val a = person.also {
it.name
}
print(a) // 输出"Person(name=fzh, age=22)"
with
- 直接调用类的方法
val person = Person("fzh", 22)
with(person) {
print("name = $name, age = $age")
}
- 返回值可以为函数块的最后一行
val person = Person("fzh", 22)
val age = with(person) {
age
}
print("age = $age") // 输出"age = 22"
run
run 可以看作 let 和 with 的结合体。集合了两者的功能和优点,一方面不用 it 代替对象,一方面可以对对象进行判空。
val person = Person("fzh", 22)
person.run {
println("name = $name")
}
val age = person.run {
22
}
println("age = $age")
getPerson()?.run {
println("run into")
}
apply
apply 的用法和 run 基本一样,区别在于 apply 返回的是对象本身。可以看作 let 和 also 的结合体。
总结
run 可以看作 let 和 with 的结合体。
apply 可以看作 also 和 with 的结合体。
所有一般来说,使用 run 和 apply 就行了。