当包含返回 Mono 的函数时,我应该如何使用 Mono.zipWith?

And*_*dyB 5 java project-reactor spring-webflux

我有一个Mono我想与另一个结合Mono,如:

val firstMono = Mono.just("thing");
val secondMono = Mono.just("other thing");
val thirdMono = firstMono.zipWith(secondMono, function);
Run Code Online (Sandbox Code Playgroud)

但我希望 thefunction也返回 a Mono而不会以 a 结束Mono<Mono<?>>

我能想到的最好的是:

val thirdMono = firstMono.zipWith(secondMono, function)
                          .flatMap(identity());
Run Code Online (Sandbox Code Playgroud)

但这似乎有点像黑客。

我也想到了

val thirdMono = firstMono.zipWith(secondMono)
                         .flatMap(function);
Run Code Online (Sandbox Code Playgroud)

但在那种情况下,我必须function接受一个Tuple2而不是单个参数,这更丑陋。

有什么想法吗?

Ale*_*kin 4

我认为你的解决方案已经足够好了。

如果您认为这看起来像 hack,您可以将其放在单独的实用程序方法中,并在找到更好的解决方案时更改它。就像是:

private static  <T1, T2, O> Function<Mono<T1>, Publisher<O>> flatZipTransformer(
        Mono<T2> p2, BiFunction<T1, T2, Mono<O>> function) {
    return p1 -> Mono.zip(p1, p2, function).flatMap(Function.identity());
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样使用它:

firstMono.transform(flatZipTransformer(secondMono, function))
Run Code Online (Sandbox Code Playgroud)