序、慢慢来才是最快的方法。
Kotlin 中的 let
、run
和 apply
都是 Scope Functions(作用域函数),用于限定一个代码块的作用域。它们的区别在于返回值和使用场景上。
let函数
源码:
Kotlin
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
使用:
Kotlin
intent.extras?.let {
shareId = it.getInt(Constant.CONTENT_ID_KEY, -1)
shareTitle = it.getString(Constant.CONTENT_TITLE_KEY, "")
shareUrl = it.getString(Constant.CONTENT_URL_KEY, "")
}
let
函数是将一个对象作为 lambda 表达式的参数,在 lambda 表达式内部可以通过it
引用这个对象。它的返回值是 lambda 表达式的执行结果。- 由于
let
函数的返回值就是 lambda 表达式的执行结果,所以我们可以继续链式调用另一个let
函数,并在其内部打印出转换后的字符串。 let
函数适合对一个对象进行一系列处理,并返回处理结果的场景。
run函数
源码:
Kotlin
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
使用:
Kotlin
toolbar.run {
title = resources.getString(R.string.login)
setSupportActionBar(this)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
- run 函数是将一个对象作为 lambda 表达式的接收者,在 lambda 表达式内部可以通过 this 或省略掉 this 直接访问对象的方法和属性。它的返回值是 lambda 表达式的执行结果。
- run 函数适合对一个对象进行一系列处理,并返回处理结果的场景。它和 let 函数的不同在于,run 函数将 lambda 表达式的执行结果作为返回值,而 let 函数将 lambda 表达式的参数作为返回值。
apply函数
源码
Kotlin
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
使用
Kotlin
toolbar.apply {
title = ""//getString(R.string.loading)
setSupportActionBar(this)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
- apply 函数是将一个对象作为 lambda 表达式的接收者,在 lambda 表达式内部可以通过 this 或省略掉 this 直接访问对象的方法和属性。它的返回值是对象本身。
- apply 函数适合对一个对象进行一系列操作,例如初始化对象的属性,而不需要返回结果的场景。因为它返回的是对象本身,所以可以使用链式调用。
run和apply的区别
- run函数返回最后一行的值/表达式
- apply函数返回传入的对象的本身