Как я должен использовать Mono.zip с включением функции, которая возвращает Mono? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 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());

но это похоже на хак.

Я тоже думал о

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

но в этом случае мне нужно, чтобы function принял Tuple2 вместо отдельных аргументов, что уродливее.

Есть мысли?

1 Ответ

0 голосов
/ 13 ноября 2018

Я думаю, что ваше решение достаточно хорошее.

Если вы думаете, что это похоже на взлом, вы можете поместить его в отдельный служебный метод и изменить его, когда найдете лучшее решение.Что-то вроде:

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