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())
}

输出结果:

Kotlin之标准库函数_also

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)
}


输出结果:

Kotlin之标准库函数_with_02

通过示例和输出结果可以发现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判断时就比较香了。

Kotlin之标准库函数_apply_03

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)
}

输出结果:

Kotlin之标准库函数_let_04

takeUnless

takeUnless函数和takeIf函数辅助使用,takeUnless函数使lambda表达式里的条件语句返回false时返回接收对象。