Kotlin学习_run/let/apply/with的区别

run、let、apply、with都是kotlin的标准库里面的函数,这几个函数都有相似的地方,但是又有区别。

run函数

可以看出run是一个扩展函数,并且有返回值的,将最后一行做为返回,默认返回Unit,那么我们来写个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data class User(val name: String = "jowan", val age: Int = 24)

fun main(args: Array<String>) {
val user = User()
// runUnit类型为Unit
val runUnit = user.run {
println("runUnit:$this") // 打印runUnit:User(name=jowan, age=24)
}
println("runUnit type:$runUnit") // 打印runUnit type:kotlin.Unit
// run类型为User
val run = user.run {
println("run:$this") // 打印run:User(name=jowan, age=24)
User(age = 1)
}
}

let函数

可以看出let也是一个扩展函数,与run函数一样,同样是有返回值,将最后一行做为返回,默认返回Unit,但是与run不同的时候,let有参数而run没有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data class User(val name: String = "jowan", val age: Int = 24)

fun main(args: Array<String>) {
val user = User()
// letUnit类型为Unit
val letUnit = user.let {
println("letUnit:$it")
}
println("letUnit type:$letUnit")
// let类型为User
val let = user.let {
it ->
println("let:$it")
User(age = 2)
}
}

apply函数

apply

可以看出apply函数也是一个扩展函数,也有返回值,默认返回该对象,与run的区别是run返回最后一行,apply返回该对象:

1
2
3
4
5
6
7
8
9
10
11
12
data class User(val name: String = "jowan", val age: Int = 24)

fun main(args: Array<String>) {
val user = User()
// apply类型为User
val apply = user.apply {
println("apply:$this") // 打印apply:User(name=jowan, age=24)
}
apply.let {
println("apply let:$it") // 打印apply let:User(name=jowan, age=24)
}
}

with函数

with

可以看出with函数不是扩展函数,与letapply有点像,同样是有返回值,将最后一行做为返回,默认返回Unit,并且可以直接调用对象的方法和变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
data class User(val name: String = "jowan", val age: Int = 24)

fun main(args: Array<String>) {
val user = User()
// withUnit类型为Unit
val withUnit = with(user) {
println("withUnit:$this") // 打印withUnit:User(name=jowan, age=24)
}
// with类型为User
val with = with(user) {
println("with:$this, name:$name, age:$age") // 打印with:User(name=jowan, age=24), name:jowan, age:24
User(age = 111)
}
with.let {
println("with let:$it") // 打印with let:User(name=jowan, age=111)
}
}

小结

函数名 返回值 参数 函数类型
run 闭包返回 扩展函数
let 闭包返回 it 扩展函数
apply this 扩展函数
with 闭包返回 非扩展函数