【问题标题】:Mono flatMap + switchIfEmpty Combo Operator?Mono flatMap + switchIfEmpty 组合运算符?
【发布时间】:2020-05-09 04:37:16
【问题描述】:

是否有允许处理结果/成功的运算符,无论 Mono 是否为空。例如:

Mono<Bar> result = sourceMono.flatMap(n -> process(n)).switchIfEmpty(process(null));

地点:

Mono<Bar> process(Foo in){
Optional<Foo> foo = Optional.ofNullable(in);
...
}

是否有允许类似以下或类似内容的快捷操作符?

Mono<Bar> result = sourceMono.shortCut(process);

更具体地说,mono.someOperator() 返回Optional&lt;Foo&gt;,当 Mono 为空时将包含 null,否则有值。

我想避免像上面提到的那样创建流程方法,并且只有一个代码块,但不确定哪个操作员可以在不重复块的情况下提供帮助。

【问题讨论】:

    标签: spring-webflux project-reactor spring-reactive spring-reactor


    【解决方案1】:

    没有内置运算符可以完全按照您的意愿行事。

    作为一种解决方法,您可以将Mono&lt;Foo&gt; 转换为发出空Optional&lt;Foo&gt; 而不是完成空的Mono&lt;Optional&lt;Foo&gt;&gt;,然后对发出的Optional&lt;Foo&gt; 进行操作。

    例如:

    Mono<Bar> result = fooMono            // Mono<Foo>
        .map(Optional::of)                // Mono<Optional<Foo>> that can complete empty
        .defaultIfEmpty(Optional.empty()) // Mono<Optional<Foo>> that emits an empty Optional<Foo> rather than completing empty
        .flatMap(optionalFoo -> process(optionalFoo.orElse(null)));
    

    【讨论】:

    • 绝招!!我可以将它与 transformDeffered 结合起来制作一个可重用的函数/运算符....注意:我必须将 Optional.empty() 更改为 Mono.just(Optional.empty()) 因为 switchIfEmpty 期望 Mono (也许更新它以使可供他人使用)。
    • 我认为这是链接多个调用的常见场景,不知道为什么没有添加 Operator。
    • 我编辑了答案以使用defaultIfEmpty(我的意图)而不是switchIfEmpty
    • 我们不想引入任何处理 null 的内容,除非绝对必要,以在 API 中全局阻止 null (因为 Reactive Streams 规范禁止 onNext(null)
    【解决方案2】:

    按照上面@phil 的解决方法,这里有一个可重用的函数:

    private final <T> Mono<Optional<T>> afterSucess(Mono<T> source) {
        return source
           .map(Optional::of) //
           .defaultIfEmpty(Optional.empty());
    }
    

    然后在发布者行中调用:

    Foo<Bar> result = fooMono
        .transformDeferred(this::afterSucess)
        .flatMap(optionalFoo -> process(optionalFoo.orElse(null)));
    

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2020-12-06
      相关资源
      最近更新 更多