kotlin - 如何使用 kotlinx-coroutines-reactive 处理空场景?

标签 kotlin kotlinx.coroutines

kotlinx-coroutines-reactive使 org.reactivestreams.PublisherawaitXXX方法:

val person = peopleReactiveRepository.findById(personId).awaitSingle()

如果通过人员 ID 找不到任何人员,则此调用将抛出 NoSuchElementException 和 这个异常不能直接在用户代码中处理 .和 Spring MVC ExceptionHandler无法将此异常转换为用户友好的响应。
java.util.NoSuchElementException: No value received via onNext for awaitSingle
at kotlinx.coroutines.experimental.reactive.AwaitKt$awaitOne$$inlined$suspendCancellableCoroutine$lambda$1.onComplete(Await.kt:131) ~[kotlinx-coroutines-reactive-0.22.1.jar:na]
at reactor.core.publisher.StrictSubscriber.onComplete(StrictSubscriber.java:123) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1327) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onComplete(FluxHide.java:137) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:130) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1.onComplete(ObservableToPublisher.java:78) ~[mongodb-driver-reactivestreams-1.6.0.jar:na]

我能想到的方法之一如下:
val person = peopleRepository.findById(personId).awaitFirstOrDefault(null)

if (person == null) {
    // do something
}

但我不认为这是一种优雅的方式。例如,可以提供一个名为 awaitSingleOptional 的方法。 .

有没有更好的 Kotlin 方法来处理这种情况?

最佳答案

没有标准Optional Kotlin 中的包装器。您可以使用 the let function对于此类情况:

val person = peopleRepository.findById(personId).awaitFirstOrDefault(null)?.let {
    // do
}

如果 await 表达式的计算结果为默认值 null , let调用也将评估为 null .如果您需要处理这种情况,Elvis operator可以使用:
.let {...} ?: throw IllegalStateException()

关于kotlin - 如何使用 kotlinx-coroutines-reactive 处理空场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48617490/

相关文章:

android - Kotlin/Android - 获取 onBindViewHolder Item 中生成的按钮的 ID

regex - 如何捕获重复捕获组中每个组的组号

kotlin - 如何在 Kotlin/Native 中构建 kotlinx.coroutines(测试版本 0.23.4-native-1)

spring-boot - 哪个 CoroutineScope 用于 Spring Boot WebFlux 端点

multithreading - Kotlin中如何等待线程初始化变量?

javafx - 从 getValue() 和 setValue() 函数之外的 Delegated Property 中获取 KProperty 信息

java - 在 kotlin 中首次构建 Room 数据库时如何修复异常

android - Jetpack Compose 实际上适用于类而不是函数?

kotlin - 在 kotlin 1.3 中使用协程的正确方法

kotlin - 正确的互斥方式