1. введение
Функциональные интерфейсы , предоставляемые JDK, не подготовлены должным образом для обработки проверенных исключений. Если вы хотите узнать больше об этой проблеме, проверьте эту статью.
В этой статье мы рассмотрим различные способы преодоления таких проблем с помощью функциональной библиотеки Java Var .
Чтобы получить дополнительную информацию о Var и о том, как его настроить, ознакомьтесь с этой статьей .
2. Использование Проверенной Функции
Vavr предоставляет функциональные интерфейсы , которые имеют функции, вызывающие проверенные исключения. Эти функции являются Проверенной функцией 0 , Проверенной функцией 1 и так далее до Проверенной функции 8 . В 0, 1, … 8 в конце имени функции указывается количество входных аргументов для функции.
Давайте рассмотрим пример:
static Integer readFromFile(Integer integer) throws IOException { // logic to read from file which throws IOException }
Мы можем использовать описанный выше метод внутри лямбда-выражения без обработки IOException :
Listintegers = Arrays.asList(3, 9, 7, 0, 10, 20); CheckedFunction1 readFunction = i -> readFromFile(i); integers.stream() .map(readFunction.unchecked());
Как вы можете видеть, без стандартных try-catch или методов-оболочек мы все еще можем вызывать методы исключения внутри лямбда-выражения.
Мы должны проявлять осторожность при использовании этой функции с Stream API, так как исключение немедленно завершит операцию – откажется от остальной части потока.
3. Использование Вспомогательных Методов
Класс API предоставляет метод быстрого доступа для примера в предыдущем разделе:
Listintegers = Arrays.asList(3, 9, 7, 0, 10, 20); integers.stream() .map(API.unchecked(i -> readFromFile(i)));
4. Использование Подъема
Чтобы изящно обработать Исключение IOException , мы можем ввести стандартные блоки try-catch внутри лямбда-выражения. Однако краткость лямбда-выражения будет потеряна. Подъем Вавра приходит нам на помощь.
Лифтинг-это концепция функционального программирования. Вы можете поднять частичную функцию до полной функции, которая возвращает параметр | в качестве результата.
Частичная функция-это функция, которая определена только для подмножества домена, в отличие от полной функции, которая определена для всей его области. Если частичная функция вызывается с входными данными, которые находятся за пределами ее диапазона поддержки, она обычно создает исключение.
Давайте перепишем пример из предыдущего раздела:
Listintegers = Arrays.asList(3, 9, 7, 0, 10, 20); integers.stream() .map(CheckedFunction1.lift(i -> readFromFile(i))) .map(k -> k.getOrElse(-1));
Обратите внимание, что результатом поднятой функции является Option , а результатом будет Option.Нет в случае исключения. Метод getOrElse() принимает альтернативное значение для возврата в случае Option.Нет .
5. Использование Try
В то время как метод lift() в предыдущем разделе решает проблему внезапного завершения программы, он фактически проглатывает исключение. Следовательно, потребитель нашего метода понятия не имеет о том, что привело к значению по умолчанию. Альтернативой является использование контейнера Try .
Try – это специальный контейнер, в который мы можем вложить операцию, которая может вызвать исключение. В этом случае результирующий объект Try представляет собой Сбой и обертывает исключение.
Давайте посмотрим на код, который использует Try :
Listintegers = Arrays.asList(3, 9, 7, 0, 10, 20);
integers.stream() .map(CheckedFunction1.liftTry(i -> readFromFile(i))) .flatMap(Value::toJavaStream) .forEach(i -> processValidValue(i));
Чтобы узнать больше о контейнере Try и о том, как его использовать, проверьте эту статью .
6. Заключение
В этой краткой статье мы показали, как использовать функции из библиотеки Var, чтобы обойти проблемы при работе с исключениями в лямбда-выражениях.
Хотя эти функции позволяют нам элегантно справляться с исключениями, их следует использовать с предельной осторожностью. При некоторых из этих подходов потребители ваших методов могут быть удивлены неожиданными проверенными исключениями, хотя они явно не объявлены.
Полный исходный код для всех примеров в этой статье можно найти на Github .