kotlin - Kotlin 中的条件副作用和可选类型

标签 kotlin side-effects

我正在尝试在 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/

相关文章:

java - Kotlin 方法重载

hibernate - Kotlin、JPA 和@Transient

android - 正则表达式删除除句点外的所有特殊字符

swift - Swift 中有没有一种方法可以计算 3 个数字的所有可能加法、乘法、减法或除法。包括括号

kotlin - 如何使用 Java 互操作处理可为 null 的泛型

javascript - redux 中间件和 redux-observable 史诗之间有什么区别?

delphi - writeln (“:width” 说明符的明显副作用会导致输出中出现问号)

javascript - 有没有办法确定 JavaScript 函数是否有副作用?

javascript - 在 JavaScript 中链接复合赋值运算符

C# 范式 : Side effects on Lists