Mono flatMap + switchIfEmpty 组合运算符?

Mono flatMap + switchIfEmpty Combo Operator?

是否有一个运算符允许处理 result/success 无论 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() returns Optional<Foo> 当 Mono 为空时将包含 null,否则具有值。

我想避免创建上面提到的过程方法,只有一个代码块,但不确定哪个运算符可以在不复制块的情况下提供帮助。

没有内置运算符可以完全满足您的需求。

作为解决方法,您可以将 Mono<Foo> 转换为发出空 Optional<Foo> 而不是完成空的 Mono<Optional<Foo>>,然后对发出的 Optional<Foo> 进行操作.

例如:

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)));

按照上面@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)));