Kotlin Standard Functions
Kotlin 提供了一些 Extensions 叫 Standard Functions,合理使用 Standard Functions 可以提高代码可读性。
本文主要分析学习下其中的 T.run, T.apply, T.let, T.also, T.takeIf 和 T.takeUnless 。
T.run & T.apply
直接看 T.run的源码
1 | public inline fun <T, R> T.run(block: T.() -> R): R { |
很简短的一个 inline 方法,其中的入参的 T.() -> R 是这个方法的关键,在 Kotlin 里这种用法叫 Function literals with receiver ,通过它 lambda 就可以直接获得一个显式的 this 指向 T 这个对象,所以在 block() 这个 lambda 里的上下文就变成了 T 。
这样通过 T.run 就能简洁地创建一个局部的上下文运行环境了。
T.apply 与 T.run 唯一的不同在于 T.apply 执行完 lambda 后会返回 T ,而 T.run 返回的是 lambda 的执行结果1
2
3
4public inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
下面用两个例子来简单说明 T.run 和 T.apply 的用法
1 | // 使用 T.run 前 |
T.let & T.also
T.let 与 T.also 的关系跟上述类似
1 | public inline fun <T, R> T.let(block: (T) -> R): R { |
T.let 返回的是 lambda 的执行结果,T.also 返回的是 T 本身
T.let 和 T.also 都使用了 T 做为 lambda 的入参,所以我们在使用时需要以 it 或重命名的 T 来调用 T 的方法。
T.let 常用于创建局部运行环境,T.also 因为其返回 T 本身则可以用于构建链式调用。
T.takeIf & T.takeUnless
1 | public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? { |
很好理解,T.takeIf 是当传入的 lambda 返回 true 时返回 T,而 T.takeUnless 则是当传入的 lambda 返回 false 时返回 T。
T.takeUnless 的简单用法
1 | fun getInstance(welcomeEntity: WelcomeDialogEntity?) = welcomeEntity |
尾声
你或许会好奇创建这么多 lambda 是否会影响性能,答案是不会,理由是上面描述的方法使用了 inline 关键字。
