Лучшая обработка исключений в потоках Java 8 с помощью Vavr.

luchshaya obrabotka isklyuchenij v potokah java 8 s pomoshhyu vavr

от Раджасекара Эланго

В этой публикации я дам советы по лучшей обработке исключений в потоках Java 8 с помощью функциональной библиотеки Java Vavr.

Проблема

Чтобы проиллюстрировать на примере, допустим, мы хотим напечатать день недели для заданного потока строк дат в формате MM/dd/YYYY.

Начальное решение

Давайте начнем с исходного решения, как показано ниже, и итерационно усовершенствуем его.

Это выведет

Хаесли строка дать недействительна, сначала это не удается DateTimeParseException без продления действительных дат.

Java 8 Необязательно для спасения

Мы можем переработать parseDate возвращаться Optional<LocalDate> чтобы он отвергал недействительные и продолжил обработку действительных дат.

Это позволит пропустить ошибки и преобразовать все действительные даты.

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.

Первоначально опубликовано на

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *