Mono vs Flux в реактивном потоке
Согласно документации:
Flux - поток, который может испускать 0..N элементов:
Flux<String> fl = Flux.just("a", "b", "c");
Моно представляет собой поток из 0..1 элементов:
Mono<String> mn = Mono.just("hello");
И так как оба являются реализациями интерфейса Publisher в реактивном потоке.
Разве мы не можем использовать только Flux в большинстве случаев, так как он также может испускать 0..1, тем самым удовлетворяя условиям Mono?
Или существуют определенные условия, когда необходимо использовать только Mono, а Flux не может обрабатывать операции? Пожалуйста, предложите.
Ответы
Ответ 1
Во многих случаях вы выполняете вычисления или вызываете службу, и вы ожидаете ровно один результат (или, может быть, нулевой или один результат), а не коллекцию, которая содержит, возможно, несколько результатов. В таких случаях удобнее иметь Mono
.
Сравните его с "обычной" Java: вы не будете использовать List
как возвращаемый тип любого метода, который может возвращать нулевой или один результат. Вместо этого вы должны использовать Optional
, которая сразу же станет ясно, что вы не ожидаете более одного результата.
Ответ 2
Flux эквивалентен RxJava Observable способен излучать
- ноль или больше элемента (потоки из множества элементов)
- и затем ДОПОЛНИТЕЛЬНО, завершая ИЛИ сбой
Моно может испускать максимум один элемент (поток одного элемента)
Связи:
- Если вы соедините два Monos, вы получите Flux
- Вы можете вызвать single() на Flux, чтобы вернуть Mono
Ответ 3
Из документов здесь
Это различие несет в себе немного семантической информации, указывающую на грубую мощность асинхронной обработки. Например, HTTP-запрос производит только один ответ, поэтому нет смысла делать операцию подсчета. Выражение результата такого HTTP-вызова как Моно, таким образом, имеет больше смысла, чем выражение его как Flux, поскольку оно предлагает только операторы, которые имеют отношение к контексту нулевых элементов или одного элемента.