目录
apply
apply函数可以看做属性配置函数,通过传入一个接收者,通过一系列的函数配置以便使用,如果提供lambda表达式给apply,则返回配置好的接收者对象。
class User {
var age: Int = 0
var name: String = ""
override fun toString(): String {
return "年龄 $age 名字 $name"
}
}
fun main() {
val user = User().apply {
age = 12
name = "张三"
}
print(user.toString())
}
输出结果:
let
let函数使某个变量作用于lambda表达式里,通过it关键字引用它
class User {
var age: Int = 0
var name: String = ""
override fun toString(): String {
return "年龄 $age 名字 $name"
}
}
fun main() {
val user = User()
val let = user.let {
it.age = 12
it.name = "张三"
"王五"
}
print(let)
}
输出结果:
通过示例和输出结果可以发现let和apply的区别:
1、let会把接收者对象传给lambda表达式,而apply不会
2、let返回的是lambda表达式最后一行,apply返回的是当前接收者
also
also函数和let函数功能基本一样,不同的是also返回的是接收者对象,而let返回的是lambda表达式最后一行,基于also返回接收者对象,我们可以通过also做基于原始对象的一些链式调用
val user = User().also {
print(it.age)
}.also {
it.name = "王五"
}.also {
print(it.name)
}
print(user)
run
run函数的使用和apply差不多,我们借助编译器截图看,run返回的是lambda表达式的结果,而不是返回的接收者,这个在if-else判断时就比较香了。
with
with函数的功能和run基本一样,唯一不同就是调用方式不同,with需要传入值参
val with = with(user) {
user.age == 1
}
print(with)
takeIf
takeIf函数根据lambda表达式内的条件语句给出的true或者false,如果是true就返回接收者对象,如果是false就返回null,功能来看和if语句类似,优点在于可以直接在对象实例调用,不需要再变量赋值
class User {
var age: Int = 0
var name: String = "王五"
override fun toString(): String {
return "年龄 $age 名字 $name"
}
}
fun main() {
val name = User().takeIf {
it.age == 1
}?.name
print(name)
}
输出结果:
takeUnless
takeUnless函数和takeIf函数辅助使用,takeUnless函数使lambda表达式里的条件语句返回false时返回接收对象。