Комментарии 6
На первый взгляд, не вижу разницы с Try. Вам не удается представить ошибку HTTP протокола в виде Exception? А что мешает? Вы же все равно расширяете типы отказов классами.
Ну т.е. в самом примитивном варианте, чисто в качестве иллюстрации:
XResult.err(new RuntimeException("HTTP error 401"))
И что изменилось?
На первый взгляд, не вижу разницы с Try
Try не обрабатывает null значения, Optional не умеет перехватывать исключения, XResult делает и то, и другое
Трудно установить место возниковения null при использовании нескольких операций `map()` и непонятно какой фильтр сработал при использовании нескольких операций `filter()`. Иными словами, Optional не сохраняет контекста при возникновении проблемы. Ну да ладно, не будем слишком придираться.
Вообще в теории map именно тем и отличается от for-each, что у него нет императивного контекста.
Мне интересно, а в случае с опциональными полями класса предлагается тоже писать XResult? Меня в принципе смущает, что оригинальный Result не несёт в дженерике тип ошибки(как, например, IO из ZIO), чтобы по сигнатуре можно было понять чего ожидать, а тут ещё и скрывается был ли null результатом выполнения чистой функции или сайд эффекта, т.е. для меня метод возвращающий Result<Option<T>> означает, что метод с сайд эффектом может вернуть значение или отсутствие значения, а ещё ошибку, итого 3 исхода, все из которых видно по сигнатуре, а XResult это скрывает, по итогу на каждый такой метод нужно писать проверку на null, но длиннее т.к. == null заменяется на isInstanceOf NPE и потом ещё и в половине случаев обрабатывать это не как ошибку, а как ожидаемое отсутствие значения.
Прагматичное функциональное программирование в Java