Понимание различий между Mono.defer() и Mono.fromSupplier() в Reactor

Reactor – это популярная библиотека Java для создания реактивных приложений, предоставляющая различные операторы для управления реактивными потоками. В этой статье мы рассмотрим различия между двумя такими операторами: Mono.defer() и Mono.fromSupplier(). Мы рассмотрим варианты их использования, предоставим примеры кода и обсудим их значение в реактивном программировании. Давайте погрузимся!

Понимание Mono.defer():
Оператор Mono.defer() в Reactor используется для создания Mono, который лениво оценивается для каждого подписчика. Это означает, что код внутри блока defer() будет выполняться каждый раз, когда подписчик подписывается на Mono. Это особенно полезно, когда значение внутри Mono необходимо вычислить или получить динамически.

Вот пример, иллюстрирующий использование Mono.defer():

Mono<String> deferredMono = Mono.defer(() -> {
    // Perform dynamic computation or fetch data
    String result = fetchDataFromExternalService();
    return Mono.just(result);
});

В приведенном выше примере метод fetchDataFromExternalService() будет вызываться каждый раз, когда подписчик подписывается на deferredMono. Это гарантирует, что данные извлекаются или вычисляются динамически, предоставляя свежие результаты для каждой подписки.

Понимание Mono.fromSupplier():
Оператор Mono.fromSupplier(), с другой стороны, используется для создания Mono, который выдает одно значение, предоставленное функцией поставщика. Функция поставщика вызывается только один раз, во время создания Mono, и полученное значение передается всем подписчикам.

Вот пример, иллюстрирующий использование Mono.fromSupplier():

Mono<String> supplierMono = Mono.fromSupplier(() -> {
    // Compute or generate a value
    return "Hello, world!";
});

В приведенном выше примере функция поставщика вызывается только один раз, во время создания поставщикаMono. Результирующее значение «Привет, мир!» передается всем подписчикам.

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

Используйте Mono.defer(), если:

  • Значение внутри Mono необходимо вычислять или получать динамически.
  • Вычисления или получение данных являются дорогостоящими, и их следует отложить до подписки.
  • Каждый подписчик должен получить новую ценность.

Используйте Mono.fromSupplier(), когда:

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

В этой статье мы рассмотрели различия между Mono.defer() и Mono.fromSupplier() в Reactor. Мы узнали, что Mono.defer() позволяет выполнять динамические вычисления или выборку данных, а Mono.fromSupplier() предоставляет единое значение, совместно используемое всеми подписчиками. Понимание этих различий и выбор подходящего оператора в зависимости от вашего варианта использования имеют решающее значение в реактивном программировании.