如何使用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 MVCExceptionHandler
无法将此异常转换为用户友好的响应
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
overOption
更为惯用,请看哪个提到let
,而不是Option
/Optional
谢谢你的想法:嘿,你注意到新功能了吗?