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, поскольку оно предлагает только операторы, которые имеют отношение к контексту нулевых элементов или одного элемента.