Kotlin提供了几种拓展函数(extension function),有的可以更优雅处理可空变量问题。
在学习 Kotlin 时,一定都会注意到它有许多let apply run 等这些 extension function,它们看起来大同小异,用起来似乎也经常可以相互替换,稍做修改就让程式依照正确的逻辑执行。
一、let
1、在函数体内使用 it 代替调用者访问其公有的属性和方法。
val person = Person("yrdz", 24)
person.let {
print("name = ${it.name}")
print("age = ${it.age}")
}
2、可以对一个可能为空的对象(object?)进行判空操作。
val person = getPerson()
// 如果person为null,将不会执行let块
person?.let {
print("name = ${it.name}")
print("age = ${it.age}")
}
3、返回值可以为函数的最后一行。
val person = Person("yrdz", 24)
val a = person.let {
it.age
it.name
}
print(a) // 输出"yrdz"
【案例】
日志:
二、also
also 的用法和 let 基本一样,区别在于 also 返回的是对象本身。
val person = Person("yrdz", 24)
val a = person.also {
it.name
}
print(a) // 输出"Person(name=yrdz, age=24)"
三、with
1、直接调用类的方法。
val person = Person("yrdz", 24)
with(person) {
print("name = $name, age = $age")
}
2、返回值可以为函数块的最后一行。
val person = Person("yrdz", 24)
val age = with(person) {
name
age
}
print("age = $age") // 输出"age = 24"
【案例】
日志:
四、run
run 可以看作 let 和 with 的结合体。集合了两者的功能和优点,一方面不用 it 代替对象,一方面可以对对象进行判空,返回的值是lambda表达式的最后一句;
val person = Person("yrdz", 24)
person.run {
println("name = $name")
}
val age = person.run {
26
}
println("age = $age")
getPerson()?.run {
println("run into")
}
【案例】
日志:
五、apply
apply 的用法和 run 基本一样,区别在于 apply 返回的是对象本身。可以看作 let 和 also 的结合体。
返回的值是lambda表达式的最后一句;必须要有返回值。
【案例】
日志:
六、总结
run 可以看作 let 和 with 的结合体。
apply 可以看作 also 和 with 的结合体。
所有一般来说,使用 run 和 apply 就行了。