我正在尝试在 Kotlin 中执行一个简单的副作用:
fun handle(request: Request) {
repository.findByUID(request.userId)?.let {
if (someCondition) return
service.run(...)
}
}
如您所见,当 repository 返回非空值且满足 someCondition 时,应执行副作用。
除了使用 if{}-return 构造之外,有没有 Kotlin 的方式来做到这一点?
在 Java 8 中,可以通过以下方式实现:
optional
.filter(...)
.ifPresent(...)
最佳答案
更新:
Kotlin 1.1有一个名为 takeIf
的方法:
/**
* Returns `this` value if it satisfies the given [predicate] or `null`, if it doesn't.
*/
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
你可以这样使用它:
repository.findByUID(request.userId)?.takeIf { someCondition }?.let { service -> }
Kotlin 在标准库中不包含这样的方法。
但是,你可以定义它:
inline fun <K : Any> K.ifPresent(condition: K.() -> Boolean): K? = if (condition()) this else null
使用此方法,您的示例可以重写为:
fun handle(request: Request) {
repository.findByUID(request.userId)?.ifPresent { someCondition }?.let {
service.run(...)
}
}
另一种选择可能是使用列表的内置扩展(但使用列表会产生开销):
listOf(repository.findByUID(userId)).filter { someCondition }.forEach { service.run(...) }
关于kotlin - Kotlin 中的条件副作用和可选类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41358898/