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

时间:2018-11-12 16:40:44

标签: java spring-webflux project-reactor

我有一个Mono要与另一个Mono结合使用,例如:

val firstMono = Mono.just("thing");
val secondMono = Mono.just("other thing");
val thirdMono = firstMono.zipWith(secondMono, function);

但是我希望function也返回Mono不包含,最后返回Mono<Mono<?>>

我能想到的最好的方法是:

val thirdMono = firstMono.zipWith(secondMono, function)
                          .flatMap(identity());

但这似乎有点hacking。

我也想到了

val thirdMono = firstMono.zipWith(secondMono)
                         .flatMap(function);

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为您的解决方案足够好。

如果您认为这似乎是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());
}

现在,您可以像这样使用它:

firstMono.transform(flatZipTransformer(secondMono, function))