Для функционального программирования в Java достаточно одной монады
Монада
XResult<T>
, заменяющей Optional
, Result
и Either
. Эта монада обрабатывает различные типы отказов, включая отсутствие значений, исключения и специфические ошибки. XResult
предоставляет два основных варианта: Ok
для успешного результата и Err
для ошибки, содержащей причину типа ErrCause
. Изображение носит иллюстративный характер
ErrCause
— расширяемый интерфейс для описания ошибок. Включает реализации: ExceptionCause
для исключений, FilterCause
для ошибок фильтрации, SimpleCause
для текстовых сообщений. Отсутствие NullCause
компенсируется созданием ExceptionCause
с NullPointerException
для обнаружения null
. Метод fromCallable()
автоматически оборачивает результаты и ошибки в XResult
, обрабатывая исключения и null
. Монада
XResult
обеспечивает композицию с помощью map()
, flatMap()
, filter()
. Пример: получение пользователя может возвращать XResult.ofNullable(user)
при успехе, XResult.err(exception)
при исключении, XResult.err("HTTP error 401")
при HTTP-ошибках. Можно расширить ErrCause
классом HttpError
для подробной информации об ошибках HTTP. XResult
легко внедряется в легаси проекты и создает безопасные API. Компактный и самодостаточный код (260 строк) без внешних зависимостей покрыт тестами. Разработан для Java 8, но совместим с более новыми версиями. В будущем возможно применение sealed интерфейсов, records и pattern matching для большей лаконичности кода.