В качестве простого примера у меня есть моно, которое зависит от другого моно. Обычно я бы использовал Mono::flatMap
, чтобы связать издателей. Однако я обнаружил, что использование Mono::zip
также работает. Это «разрешено» или хорошая или плохая идея? Почему?
Mono<String> a = Mono.just("A");
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono<String> ae = a.flatMap(am->Mono.just(am.concat("E")));
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);
В качестве дополнительной мысли:
Mono<String> monoA = Mono.just("A");
Mono<String> monoB = Mono.just("B");
Mono<String> a = something(monoA);
Mono<String> b = something(monoB);
Mono<String> c = something(monoA);
Mono<String> d = something(monoA);
Mono<String> ae = something(a);
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);
Обновления: я могу добавить подпрограмму для имитации сценария использования вызова API, например:
private Mono<String> getOne() {
System.out.println("Here 1");
return Mono.just("A");
}
Тогда я могу изменить первую строку, как предложено ниже, на
Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);
Это действительно показывает, что a
испускается дважды, но создается только один раз. Быть выпущенным дважды может быть небольшой ценой, если вы подумаете о «правильном» способе решения этой ситуации, например:
Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono.zip(a, b, c, d).flatMap(tuple4->{
return Mono.just(tuple4.getT1().concat("E")).map(ae->{
// here I have everything I need
return String.format("[%s,%s,%s,%s,%s]", tuple4.getT1(), tuple4.getT2(), tuple4.getT3(), tuple4.getT4(), ae);
});
}).subscribe(System.out::println);