gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:46:52 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com