在Project Reactor中处理Mono中的可选值

ber*_*zie 5 java reactive-programming project-reactor

我想有一个Mono调用另一个异步方法,该方法将Optional类型返回给:

  1. 如果值Optional不为空,则有一个值,
  2. MonoEmpty如果该Optional值为空。

这是我现在所做的:

Mono.fromCallable(() -> someApi.asyncCall()) .filter(Optional::isPresent) .map(Optional::get)

显然,这不是理想的,因为在可调用函数完成之后它使用两个运算符。如果可能的话,我想Mono.empty()从内部获取or或mono值fromCallable

实现我想要的最好的方法是什么?

sli*_*hyi 14

Mono 有justOrEmpty可以与类型一起使用的方法Optional<? extends T>。当Optional.empty() == true我们有的时候MonoEmpty

创建一个新的 Mono,如果Optional.isPresent() 则发出指定的项目,否则仅发出 onComplete。

Mono<String> value = Mono.justOrEmpty(someApi.asyncCall());
Run Code Online (Sandbox Code Playgroud)

  • 这里的问题是您立即调用“someApi.asyncCall()”。接受的答案是更好的解决方案。 (2认同)

Ily*_*ich 9

还有一个替代方案,flatMap它比更好,Optional.isPresent并且Optional.get可能导致意外调用get on empty Optional

Mono.fromCallable(() -> someApi.asyncCall())
  .flatMap(optional -> optional.map(Mono::just).orElseGet(Mono::empty))
Run Code Online (Sandbox Code Playgroud)

  • 怎么样 `Mono.fromCallable(() -&gt; someApi.asyncCall()).flatMap(Mono::justOrEmpty)` (2认同)

Rog*_*eia 5

怎么样:

Optional<Integer> optional = Optional.of(5);
Mono<Optional<Integer>> monoWithOptional = Mono.just(optional);
Mono<Integer> monoWithoutOptional = monoWithOptional.flatMap(Mono::justOrEmpty);
Run Code Online (Sandbox Code Playgroud)