Зачем нужен моно тип в Reactor 3?
Reactor 3 имеет 2 основных типа данных, оба из которых являются реактивными издателями потоков.
reactor.core.publisher.Mono<T>
reactor.core.publisher.Flux<T>
Я понимаю разницу между Mono как потоком из 0 или 1 элементов и Flux как потоком из 0 или N элементов.
Поскольку Mono и Flush реализуют org.reactivestreams.Publisher<T>
почему нам нужны оба типа, почему бы не использовать Flux для всего?
1 ответ
Подумайте о том, что происходит в нереактивном мире: мы могли бы решить вернуть все функции List<T>
даже когда мы знаем, что они вернут только один элемент. Пример:
public List<T> findAll() <-- looks ok
public List<T> findFirst() <-- seems strange?
public T findFirst() <-- better now?
Так почему же мы не всегда возвращаемся List<T>
? потому что удобнее, что иногда мы используем List<T>
а другие просто T
Таким образом, пользователю функции легче понять, чего ожидать.
Теперь, если мы преобразуем эти примеры в реактивный мир, мы получим это:
public List<T> findAll() --> public Flux<T> findAll()
public T findFirst() --> public Mono<T> findFirst()
Конечно, мы всегда могли использовать Flux<T>
как мы всегда могли использовать List<T>
, но просто удобнее иметь возможность различать, когда есть несколько предметов или только один.