简述Kotlin中let, apply, run, with的区
2017-06-16 本文已影响2867人
zhcode
初学Kotlin,通过几个简单的例子来简单看一下Kotlin中let
, apply
,run
, with
的区别。
-
let
官方源码:
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
例子:
fun main(args: Array<String>) {
val list: MutableList<String> = mutableListOf("A","B","C")
val change: Any
change = list.let {
it.add("D")
it.add("E")
it.size
}
println("list = $list")
println("change = $change")
}
输出:
list = [A, B, C, D, E]
change = 5
结论:
在let中,用
it
表示引用对象,并可调用其方法,it
不可省略。
返回值是语句块的最后一行,若最后一行语句无返回值,则整个let语句块也无返回值
-
apply
官方源码:
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
例子:
fun main(args: Array<String>) {
val list: MutableList<String> = mutableListOf("A", "B", "C")
val change: Any
change = list.apply {
add("D")
add("E")
this.add("F")
size
}
println("list = $list")
println("change = $change")
}
输出:
list = [A, B, C, D, E, F]
change = [A, B, C, D, E, F]
结论:
在apply中,用
this
代表当前引用对象,并且调用其方法时,this
可省略。
apply必有返回值,且返回值是当前引用对象
-
run
官方源码:
public inline fun <T, R> T.run(block: T.() -> R): R = block()
例子:
fun main(args: Array<String>) {
val list: MutableList<String> = mutableListOf("A", "B", "C")
val change: Any
change = list.run {
add("D")
add("E")
this.add("F")
size
}
println("list = $list")
println("change = $change")
}
输出:
list = [A, B, C, D, E, F]
change = 6
结论:
在run中,用
this
代表当前引用对象,并且调用其方法时,this
可省略。
返回值是语句块的最后一行,若最后一行语句无返回值,则整个run语句块也无返回值
-
with
官方源码:
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
例子:
fun main(args: Array<String>) {
val list: MutableList<String> = mutableListOf("A", "B", "C")
val change: Any
change = with(list) {
add("D")
add("E")
this.add("F")
size
}
println("list = $list")
println("change = $change")
}
输出:
list = [A, B, C, D, E, F]
change = 6
结论:
这个感觉和run没什么区别,只是调用方式不一样。(应该有其他区别,只是我作为一个初学者暂未发现,有知道的朋友,敬请指点)