A Mono<T>
- это специализированный Publisher<T>
, который излучает не более одного элемента, а затем (опционально) завершается сигналом onComplete
или onError
. Он предлагает только подмножество операторов, доступных для Flux
, и некоторые операторы (особенно те, которые объединяют Mono
с другим Publisher
), переключаются на Flux
. Например, Mono#concatWith(Publisher)
возвращает Flux
, а Mono#then(Mono)
возвращает другое Mono
. Обратите внимание, что вы можете использовать Mono
для представления асинхронных процессов без значения, которые имеют только концепцию завершения (аналогично Runnable). Чтобы создать его, вы можете использовать пустой Mono<Void>
.
Mono и Flux - оба реактивные потоки. Они отличаются тем, что они express. Mono - это поток от 0 до 1 элемента, тогда как Flux - это поток от 0 до N элементов.
Это различие в семантике этих двух потоков очень полезно, например, для запроса к Http-сервер ожидает получения 0 или 1 ответа, в этом случае было бы нецелесообразно использовать Flux. Наоборот, при вычислении результата математической функции на интервале ожидается один результат на число в интервале. В этом другом случае целесообразно использовать Flux.
Как его использовать:
Mono.just("Hello World !").subscribe(
successValue -> System.out.println(successValue),
error -> System.error.println(error.getMessage()),
() -> System.out.println("Mono consumed.")
);
// This will display in the console :
// Hello World !
// Mono consumed.
// In case of error, it would have displayed :
// **the error message**
// Mono consumed.
Flux.range(1, 5).subscribe(
successValue -> System.out.println(successValue),
error -> System.error.println(error.getMessage()),
() -> System.out.println("Flux consumed.")
);
// This will display in the console :
// 1
// 2
// 3
// 4
// 5
// Flux consumed.
// Now imagine that when manipulating the values in the Flux, an exception
// is thrown for the value 4.
// The result in the console would be :
// An error as occured
// 1
// 2
// 3
//
// As you can notice, the "Flux consumed." doesn't display because the Flux
// hasn't been fully consumed. This is because the stream stop handling future values
// if an error occurs. Also, the error is handled before the successful values.
sources: Reactor Java # 1 - Как создать Mono и Flux? , Mono, асинхронный результат 0-1
это может быть полезно: Mono do c