Моно против потока в реактивном потоке

Согласно документации:

Flux - это поток, который может испускать 0..N элементов:

Flux<String> fl = Flux.just("a", "b", "c");

Mono - это поток из 0..1 элементов:

Mono<String> mn = Mono.just("hello");

И так как оба являются реализациями интерфейса Publisher в реактивном потоке.

Разве мы не можем использовать только Flux в большинстве случаев, поскольку он также может испускать 0..1, таким образом удовлетворяя условиям Mono?

Или есть какие-то особые условия, когда нужно использовать только Mono, а Flux не может обрабатывать операции? Пожалуйста, предложите.


person KayV    schedule 27.12.2017    source источник


Ответы (4)


Во многих случаях вы выполняете какое-то вычисление или вызываете службу и ожидаете ровно один результат (или, возможно, ноль или один результат), а не коллекцию, содержащую, возможно, несколько результатов. В таких случаях удобнее иметь Mono.

Сравните это с «обычной» Java: вы не стали бы использовать List в качестве возвращаемого типа любого метода, который может возвращать ноль или один результат. Вместо этого вы бы использовали Optional, что сразу дает понять, что вы не ожидаете более одного результата.

person Jesper    schedule 31.12.2017

Flux эквивалентен RxJava Observable может генерировать
- ноль или более элементов (потоки из многих элементов)
- а затем НЕОБЯЗАТЕЛЬНО, завершая ИЛИ сбой

Mono может выдавать не более одного элемента (транслирует один элемент)

Отношения:

  • Если вы объедините два моно, вы получите поток
  • Вы можете вызвать single () в Flux, чтобы вернуть Mono
person MagGGG    schedule 24.03.2018

Из документации здесь

Это различие несет в типе небольшую семантическую информацию, указывающую приблизительную мощность асинхронной обработки. Например, HTTP-запрос дает только один ответ, поэтому нет особого смысла выполнять операцию подсчета. Таким образом, выражение результата такого HTTP-вызова как Mono имеет больше смысла, чем выражение его как Flux, поскольку оно предлагает только операторы, относящиеся к контексту с нулевым или одним элементом.

person pvpkiran    schedule 27.12.2017

Просто как Mono используется для обработки нуля или одного результата, в то время как Flux используется для обработки от нуля до многих результатов, возможно даже бесконечных результатов. И оба эти двое совместно ведут себя чисто асинхронно и полностью неблокирующе.

person Cristian Vantini    schedule 22.01.2021