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)));
是否有一个运算符允许处理 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)));