2

是否有允许处理结果/成功的运算符,无论 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 为空时将包含mono.someOperator()返回值,否则返回值。Optional<Foo>null

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

4

2 回答 2

3

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

作为一种解决方法,您可以将 转换为Mono<Foo>发出Mono<Optional<Foo>>Optional<Foo>而不是完成空的 a,然后对发出的 进行操作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)));
于 2020-01-22T23:38:53.477 回答
1

根据上述@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-23T03:07:28.707 回答