Yan*_*fan 7 kotlin kotlinx.coroutines
kotlinx-coroutines-reactive使得org.reactivestreams.Publisher有awaitXXX方法:
val person = peopleReactiveRepository.findById(personId).awaitSingle()
Run Code Online (Sandbox Code Playgroud)
如果通过人员 ID 无法找到人员,则该调用将抛出 NoSuchElementException,并且该异常无法在用户代码中直接处理。并且 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]
Run Code Online (Sandbox Code Playgroud)
我能想到的方法之一如下:
val person = peopleRepository.findById(personId).awaitFirstOrDefault(null)
if (person == null) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
但我不认为这是一种优雅的方式。例如,可以提供名为 的方法awaitSingleOptional。
Kotlin 有没有更好的方法来处理这种情况?
Kotlin 中没有标准Optional包装器。您可以在这种情况下使用该let函数:
val person = peopleRepository.findById(personId).awaitFirstOrDefault(null)?.let {
// do
}
Run Code Online (Sandbox Code Playgroud)
如果await-表达式的计算结果为default null,let则调用的计算结果也将为null. 如果需要处理这种情况,可以使用Elvis运算符:
.let {...} ?: throw IllegalStateException()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5478 次 |
| 最近记录: |