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