Реактивный Mono :: zip с взаимозависимостью между элементами - PullRequest
0 голосов
/ 07 марта 2020

В качестве простого примера у меня есть моно, которое зависит от другого моно. Обычно я бы использовал 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);

1 Ответ

0 голосов
/ 07 марта 2020

в плоской карте publisher A необходимо завершить sh до тех пор, пока вы не сможете выполнить B, поэтому оно будет выполняться последовательно.

при использовании zip publisher A или B может завершить sh во-первых или во-вторых, это не имеет значения, оно не будет продолжаться, пока оба не будут закончены. Он будет работать в параллельном режиме.

Вы также можете посмотреть на функцию zipWith, которая является способом последовательного объединения publishers.

...