我想要一个Mono
,它调用另一个异步方法,并将Optional
类型返回给:
- 具有值
- 如果
Optional
值为空,则为MonoEmpty
以下是我现在要做的:
Mono.fromCallable(() -> someApi.asyncCall())
.filter(Optional::isPresent)
.map(Optional::get)
显然,这并不理想,因为它在可调用完成后使用了两个运算符。如果可能的话,我想要Mono.empty()
或来自fromCallable
内部的mono值。
实现我想要的最好方法是什么?
flatMap
有一种比Optional.isPresent
和Optional.get
好一点的替代方案,可能会导致意外调用空Optional
:上的get
Mono.fromCallable(() -> someApi.asyncCall())
.flatMap(optional -> optional.map(Mono::just).orElseGet(Mono::empty))
Mono有justOrEmpty
方法,可以与Optional<? extends T>
类型一起使用。当Optional.empty() == true
时,我们会有MonoEmpty
。
如果Optional.isPresent((,则创建一个发出指定项的新Mono。否则仅发出onComplete。
Mono<String> value = Mono.justOrEmpty(someApi.asyncCall());
怎么样:
Optional<Integer> optional = Optional.of(5);
Mono<Optional<Integer>> monoWithOptional = Mono.just(optional);
Mono<Integer> monoWithoutOptional = monoWithOptional.flatMap(Mono::justOrEmpty);