kotlin的let,with,run,apply,also,异同区别
例如:
class Person(var name: String, var age: Int) {
fun eat() {
println("吃饭")
}
fun work(hour: Int): Int {
println("$name $age 工作 $hour,赚${hour * 60}")
return hour * 60
}
}
fun main(args: Array<String>) {
var s: String? = null
//没用let前,每个都要加 ? 判断是否为空
val len = s?.length
var ss = s?.toByte()
println(len)
println(ss)
//使用let后,只需加一次?判空
s?.let {
val len = it.length
it.toByte()
}
val person = Person("zhang", 18)
/**
* with()把传入的对象作为接受者,函数内可使用this指代该对象来访问公有属性和方法。
* 函数的返回值为函数块最后一行或指定的return表达式。
*/
val result1 = with(person) {
age = 19
eat()
work(996)
}
println("结果1:$result1")
println("----------")
/**
* run()是with()和let()的结合,它可以像with()一样在函数体中使用this指代该对象,也可以像let()一样为对象做判空。
*/
val result2 = person?.run() {
age = 20
work(996)
eat()
}
println("结果2:$result2")
println("----------")
/**
* apply()和run()相似,不同的是,run()返回最后一行代码的值,而apply()返回传入的对象本身。
*/
val result3 = person?.apply {
age = 21
eat()
work(996) // 返回person对象
}
println("结果3:$result3")
println("----------")
/**
* also()和apply()相似,不同的是,also()在函数体内用it指代该对象,而apply()在函数体中用this指代该对象。
*/
val result4 = person?.also {
it.age = 22
it.eat()
it.work(996) // 返回传入的person对象
}
println("结果4:$result4")
println("----------")
}
输出:
null
null
吃饭
zhang 19 工作 996,赚59760
结果1:59760
----------
zhang 20 工作 996,赚59760
吃饭
结果2:kotlin.Unit
----------
吃饭
zhang 21 工作 996,赚59760
结果3:Person@7530d0a
----------
吃饭
zhang 22 工作 996,赚59760
结果4:Person@7530d0a
----------
kotlin常用表达式let,?:,as?,?.,!!_zhangphil的博客-CSDN博客it.todo() //函数内使用it替代object对象访问属性和方法。it.todo() //object不为null,才会执行let函数。当a不为null时,执行大括号里的语句(it肯定不为null)如果a == null ,则为 null。= null,则a.b()如果 a 不是 b,则为 null。如果a 是 b,则 a as b。当a为null时,什么都不执行。如果a==null,抛出空指针。=null时,执行a。当a==null时,执行b。https://blog.csdn.net/zhangphil/article/details/129264159