Я не понимаю, в чем разница между then, thenEmpty
, thenMany
и flatMapMany
на Flux
или Mono
в spring webflux.
Что тогда, thenEmpty, thenMany и flatMapMany в spring webflux?
Ответы (1)
flatMap
противflatMapMany
В функциональном программировании flatMap
возвращает тот же тип, что и тип, несущий метод, поэтому для Mono<T>
flatMap
возвращает Mono
. Это означает, что только один элемент может быть испущен внутренним Publisher
(или что он усечен). Мы добились этого, заставив Mono#flatMap
взять Function<T, Mono<R>>
.
Как следствие, нам нужна была альтернатива для более произвольного Publisher
, которая могла бы испускать более одного элемента. Следовательно, Mono#flatMapMany(Function<T, Publisher<R>>)
, который возвращает Flux<R>
.
TL; DR: Mono#flatMap
для асинхронного, но преобразование 1 в 1 элемента в источнике Mono
, Mono#flatMapMany
для асинхронного преобразования 1 в N < / strong> преобразование (например, Flux # flatMap).
then
,thenEmpty
иthenMany
Все thenXXX
методы на Mono
имеют одну общую семантику: они игнорируют исходные onNext
сигналы и реагируют на сигналы завершения (onComplete
и onError
), продолжая последовательность в этой точке с различными параметрами. Как следствие, это может изменить общий тип возвращаемого Mono
:
then
просто воспроизведет сигнал терминала источника, в результате чего будетMono<Void>
, чтобы указать, что он никогда не сигнализируетonNext
.thenEmpty
не только возвращаетMono<Void>
, но и принимаетMono<Void>
в качестве параметра. Он представляет собой конкатенацию сигнала завершения источника затем второго, пустого сигнала завершения моно. Другими словами, он завершается, когда A, затем B оба завершили последовательно, и не передает данные.thenMany
ожидает завершения источника, затем воспроизводит все сигналы из своего параметраPublisher<R>
, в результате чегоFlux<R>
будет "приостанавливаться", пока источник не завершит работу, затем испускает многие элементы от предоставленного издателя, прежде чем также воспроизвести его сигнал о завершении.
thenMany
, чтобы идти за охранником. Это хороший образец? Т.е. охрана возвращает Mono.error(...)
, если предварительное условие не выполнено, Mono.empty()
в противном случае. Затем у меня есть thenMany
, чтобы продолжить вычисления и вернуть Flux
в моем приложении webflux.
- person wilmol; 24.09.2020
Mono.error
используется внутри flatMap
(который вы назвали охранником)? в этом случае было бы меньше накладных расходов, чтобы напрямую возвращать Flux
в ветке else плоской карты, а не из thenMany
- person Simon Baslé; 25.09.2020