如何使用kotlinx协同路由处理空场景?

如何使用kotlinx协同路由处理空场景?,kotlin,kotlinx.coroutines,Kotlin,Kotlinx.coroutines,kotlinx协同程序是被动的使得org.reactivestreams.Publisher拥有awaitXXX方法: val person = peopleReactiveRepository.findById(personId).awaitSingle() 如果人员ID找不到任何人员,则此调用将抛出NoTouchElementException,此异常不能直接在用户代码中处理。Spring MVCExceptionHandler无法将此异常转换为用户友好的响应 java.util.NoSu

kotlinx协同程序是被动的
使得
org.reactivestreams.Publisher
拥有
awaitXXX
方法:

val person = peopleReactiveRepository.findById(personId).awaitSingle()
如果人员ID找不到任何人员,则此调用将抛出NoTouchElementException,此异常不能直接在用户代码中处理。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
}
但我不认为这是一种优雅的方式。例如,可以提供名为
的方法(可选)


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

Kotlin中没有标准的
可选的
包装器。在这种情况下,您可以使用:

val person = peopleRepository.findById(personId).awaitFirstOrDefault(null)?.let {
    // do
}
如果等待表达式的计算结果为默认值
null
,则
let
调用也将计算为
null
。如果您需要处理此情况,可以使用:

.let {...} ?: throw IllegalStateException()

如果您是以功能性的方式编程,那么肯定可以使用
可选的
包装器

如果你想让你的脚趾湿与函数式编程,你可以拿起哪个有和数据类型为这一目的

使用
?.let
是另一种选择,但它对反应式编程没有多大帮助


ReactiveX中还有一个类,它可以让您在执行操作时处理错误的场景。

在最近的
kotlinx.coroutines
版本中提供了一个扩展
waitfirstornull()
。看这个

摘自发行说明:

被动:添加了
awaitFirstOrDefault
awaitFirstorFull
扩展(请参见#224,公共关系由@konrad kaminski撰写)


什么是可选的,我在Kotlin JS上?不,
Optional
是JDK的一部分<代码>选项
是Arrow的一部分。什么是Arrow,我也是从目标C打电话来的?这个问题标有[kotlin]和[kotlinx.coroutines],所以我不知道目标C可能涉及到什么。Arrow是一个函数式编程库,我的答案中有一个链接。对kotlin来说,使用
let
over
Option
更为惯用,请看哪个提到
let
,而不是
Option
/
Optional
谢谢你的想法:嘿,你注意到新功能了吗?