Использование Mono и Optional вместе - PullRequest
0 голосов
/ 14 декабря 2018

Одна из вещей, которую я пытаюсь обернуть вокруг себя с помощью реактивных программ, - это отсутствие результатов.

Допустим, у меня был API, который по выбору извлекал последний заказ для пользователя.Я хочу оставить поведение, если не найден пользователь до звонящего.В простой старой Java я бы написал что-то вроде:

Optional<Order> getLatestOrder(int userId) { ... }

В webflux я пытаюсь обернуть голову, если эквивалентная функция должна возвращать Mono<Optional<Order>> или Mono<Order>.

Если я добавлю getLatestOrder() к реактивному потоку, он может прекратиться, если я испущу пустой моно.Также странно делать что-то вроде:

getLatestOrder().defaultIfEmpty(new Order());

, поскольку теперь это похоже на значение часового, которое указывает на то, что оно не существует.

Есть лируководство по шаблону с использованием Mono и Optional?Есть ли правильный способ полностью отказаться от Optional, если вы действительно хотите выразить что-то, чего нет?

1 Ответ

0 голосов
/ 14 декабря 2018

Я начал использовать webflux для небольшого проекта, и мы столкнулись с тем же вопросом.Мы решили вернуть Mono<Order> Большую часть времени мы затем используем switchIfEmpty(Mono<? extends T> alternate) для выдачи ошибки или восстановления с альтернативой

В наших случаях использования switchIfEmpty() и defaultIfEmpty() дают нам достаточно контроля для обработки пустых результатов..

Пример из справочника: https://projectreactor.io/docs/core/release/reference/index.html#_checking_the_execution_path_with_code_publisherprobe_code

...