run、let、apply、with都是kotlin的标准库里面的函数,这几个函数都有相似的地方,但是又有区别。
run函数
可以看出run
是一个扩展函数,并且有返回值的,将最后一行做为返回,默认返回Unit
,那么我们来写个例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15data 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
16data 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
函数也是一个扩展函数,也有返回值,默认返回该对象,与run
的区别是run
返回最后一行,apply
返回该对象:1
2
3
4
5
6
7
8
9
10
11
12data 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
函数不是扩展函数,与let
和apply
有点像,同样是有返回值,将最后一行做为返回,默认返回Unit
,并且可以直接调用对象的方法和变量:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17data 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 | 闭包返回 | 无 | 非扩展函数 |