
Содержание статьи
от Раджасекара Эланго
В этой публикации я дам советы по лучшей обработке исключений в потоках Java 8 с помощью функциональной библиотеки Java Vavr.
Проблема
Чтобы проиллюстрировать на примере, допустим, мы хотим напечатать день недели для заданного потока строк дат в формате MM/dd/YYYY
.
Начальное решение
Давайте начнем с исходного решения, как показано ниже, и итерационно усовершенствуем его.
Это выведет
Хаесли строка дать недействительна, сначала это не удается DateTimeParseException без продления действительных дат.
Java 8 Необязательно для спасения
Мы можем переработать parseDate
возвращаться Optional<LocalDa
te> чтобы он отвергал недействительные и продолжил обработку действительных дат.
Это позволит пропустить ошибки и преобразовать все действительные даты.
WEDNESDAY Text '01-01-2015' could not be parsed at index 2 THURSDAY Text 'not a date' could not be parsed at index 0 FRIDAY
Это большое улучшение, но исключение нужно обрабатывать в пределах parseDate
метод и не может быть передан обратно в основной метод для работы с ним. Мы не можем сделать parseDate
метод выбрасывает проверенное исключение, поскольку API Streams плохо работает с методами, выбрасывающими исключения.
Лучшее решение с Try Monad от Vavr
Vavr – это функциональная библиотека для Java 8+. Мы будем использовать Try
объект с Vavr, который может быть или экземпляром Success
или Failure
. В основном Try – это монадический тип контейнера, представляющий вычисление, которое может либо привести к исключению, либо вернуть успешно вычисленное значение. Вот модифицированный код с помощью Try
:
Выход есть
WEDNESDAY Failed due to Text '01-01-2015' could not be parsed at index 2 THURSDAYFailed due to Text 'not a date' could not be parsed at index 0 FRIDAY
Теперь исключение передается обратно в main для работы с ним. Try также имеет API для реализации логики восстановления или возврата значения по умолчанию в случае ошибки.
Чтобы продемонстрировать это, скажем, мы тоже хотим поддержать MM-dd-YYYY
как альтернативный формат строки для дат. Нижеследующий пример показывает, как мы можем легко реализовать логику восстановления.
Выход показывает, что теперь дата 01-01-2015
также успешно конвертировано.
WEDNESDAY THURSDAY THURSDAY Failed due to Text 'not a date' could not be parsed at index 0 FRIDAY
Поэтому Попробуйте Монаду можно использовать для элегантного решения исключений и быстро выходит из строя на ошибки.
Обновление от 03.12.2018:
Примеры кода обновлены для использования Doculet.
Первоначально опубликовано на