При переходе на Java 8 новый подход довольно легко адаптируется, а результирующий код становится короче и легче отслеживается, если вам не приходится иметь дело с исключениями в потоке.
Давайте рассмотрим случай Джона, который был разработчиком. Начальник сказал ему, что заказчик хочет перенести этот код на Java 8:
Джон думает: А, теперь я понял, что могу изменить цикл for с помощью потока, и я перехватил исключение. Так просто!
Это работает, но затрудняет чтение и понимание кода.
В идеале при написании кода конвейера вы хотели бы сохранить каждую промежуточную операцию в виде одной строки.
Джон говорит: Хорошая альтернатива - извлечь аргумент функции для отображения в собственный метод.
Разработчики годами писали код, подобный методу extractInputStream. Он выглядит знакомым, легким для понимания и (что еще лучше) вы можете написать тестовые примеры, чтобы убедиться, что он работает так, как вы ожидаете.
Лучше всего то, что основной метод теперь упрощен, так что промежуточная операция карты представляет собой только одну строку.
В этом случае извлеченный метод перехватывает отмеченное исключение и повторно генерирует его как неотмеченное. Этот подход неплох и довольно распространен, но он требует, чтобы вы каждый раз писали извлеченный метод.
Разве нельзя это обобщить?
Проблема здесь в том, что метод map принимает функцию, а метод apply в функции не объявляет никаких исключений.
Что, если бы вы создали другой функциональный интерфейс, похожий на Function, чей метод apply объявлял, что он генерирует исключение?
Общие параметры T и R в FunctionWithException аналогичны своим аналогам в Function, но добавленный параметр E расширяет Exception.
Метод apply теперь принимает T, возвращает R и объявляет, что может выдать E.
Теперь вы можете написать метод, называемый здесь оболочкой, который принимает аргумент типа FunctionWithException и возвращает функцию:
Аргументом метода-оболочки является любое исключение FunctionWithException.
Реализация включает блок try / catch, который перехватывает любое исключение и повторно генерирует его как непроверенное исключение. Тип возврата - java.util.function. Функция, которая является обязательным аргументом для метода карты.
Не изобретайте велосипед!
Мы стремились эффективно работать со всеми функциональными интерфейсами; нам не нужно было начинать с пустой страницы; мы можем использовать существующую зависимость maven для управления исключениями.
вы найдете проект кода на GitHub
Надеюсь, это вам поможет!
Спасибо за уделенное время. Надеюсь, у вас есть для вас интересный материал, и вы получили удовольствие от чтения.
✉ Будем на связи! Подпишитесь на мою еженедельную рассылку
❤ Если вам понравился этот пост, возможно, вам также понравятся:
Функциональное программирование на Java 8, как я это делаю?
Поскольку Java 8 выпущена, мы можем по-другому взглянуть на устаревшие обычные объекты Java (или сокращенно« POJO ) и работа… medium.com »