Что такое Mono в Project Reactor?

«Что такое Mono в Project Reactor?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Mono — это реактивный тип из библиотеки Project Reactor, представляющий асинхронную последовательность, которая может испустить ноль или один элемент, а затем завершиться (успешно или с ошибкой). Это основной строительный блок для неблокирующих операций в Spring WebFlux.

Ключевые характеристики:

  • Ленивое выполнение: Вычисления начинаются только при вызове subscribe() или другого терминального оператора.
  • Один или ноль элементов: Идеально подходит для операций, возвращающих один результат (например, поиск по ID) или не возвращающих данных (операция сохранения).
  • Богатый API: Поддерживает цепочки операторов для преобразования, фильтрации и комбинирования данных (map, flatMap, filter, zip).
  • Обработка ошибок: Предоставляет операторы для обработки сбоев (onErrorReturn, onErrorResume, doOnError).

Примеры:

// Создание Mono
Mono<String> mono = Mono.just("Hello"); // Из значения
Mono<String> monoEmpty = Mono.empty(); // Пустой Mono
Mono<String> monoError = Mono.error(new RuntimeException("Error!"));

// Преобразование и подписка
Mono<String> result = Mono.just("data")
    .map(String::toUpperCase) // Преобразование
    .doOnNext(value -> System.out.println("Получено: " + value)) // Побочный эффект
    .doOnError(error -> System.err.println("Ошибка: " + error.getMessage()));

// Без подписки ничего не произойдет
result.subscribe();

// Использование в Spring WebFlux контроллере
@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable String id) {
    return userRepository.findById(id); // Возвращает Mono<User>
}

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