Ответ
Mono
Ключевые характеристики:
- Ленивое выполнение: Вычисления начинаются только при вызове
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 позволяет писать неблокирующий, асинхронный код, который эффективно использует системные ресурсы (например, небольшое количество потоков) для обработки большого количества одновременных запросов.