Java 在项目反应器中处理来自Mono的可选值

Java 在项目反应器中处理来自Mono的可选值,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,我想要一个调用另一个异步方法的Mono,该方法将可选的类型返回到: 如果可选不为空,则有一个值 如果可选值为空,则为单空 我现在做的是: Mono.fromCallable(()->someApi.asyncCall()) .filter(可选::isPresent) .map(可选::get) 显然,这并不理想,因为它在可调用完成后使用了两个运算符。如果可能,我希望使用Mono.empty()或内部fromCallable中的Mono值 实现我想要的东西的最佳方法是什么?有一种替代方法,使

我想要一个调用另一个异步方法的
Mono
,该方法将
可选的
类型返回到:

  • 如果
    可选
    不为空,则有一个值
  • 如果
    可选值为空,则为
    单空
  • 我现在做的是:

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

    显然,这并不理想,因为它在可调用完成后使用了两个运算符。如果可能,我希望使用
    Mono.empty()
    或内部
    fromCallable
    中的Mono值


    实现我想要的东西的最佳方法是什么?

    有一种替代方法,使用
    flatMap
    可选方法要好一点。isPresent
    可选方法。get
    可能会导致意外调用get on empty
    可选方法:

    Mono.fromCallable(() -> someApi.asyncCall())
      .flatMap(optional -> optional.map(Mono::just).orElseGet(Mono::empty))
    
    那么:

    Optional<Integer> optional = Optional.of(5);
    Mono<Optional<Integer>> monoWithOptional = Mono.just(optional);
    Mono<Integer> monoWithoutOptional = monoWithOptional.flatMap(Mono::justOrEmpty);
    
    Optional=Optional.of(5);
    Mono monoWithOptional=Mono.just(可选);
    Mono monoWithoutOptional=monoWithOptional.flatMap(Mono::justOrEmpty);
    
    Mono有
    justOrEmpty
    方法,你可以使用
    选项。你可以看看:
    Mono.fromCallable(()->someApi.asyncCall()).flatMap(Mono::justOrEmpty)
    这里的问题是你可以立即调用
    someApi.asyncCall()
    。接受的答案是更好的解决方案。我检查了源代码<代码>someApi.asyncCall()
    立即被调用。不懒惰。期望是-mono不应该执行任何操作,除非有人订阅,也许你是对的
    Mono<String> value = Mono.justOrEmpty(someApi.asyncCall());