Рубрики
Без рубрики

Исключения в лямбда-выражении с использованием различных

Узнайте о различных способах преодоления обработки проверенных исключений с помощью функциональной библиотеки Java Var.

Автор оригинала: baeldung.

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 :

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);

CheckedFunction1 readFunction = i -> readFromFile(i);
integers.stream()
 .map(readFunction.unchecked());

Как вы можете видеть, без стандартных try-catch или методов-оболочек мы все еще можем вызывать методы исключения внутри лямбда-выражения.

Мы должны проявлять осторожность при использовании этой функции с Stream API, так как исключение немедленно завершит операцию – откажется от остальной части потока.

3. Использование Вспомогательных Методов

Класс API предоставляет метод быстрого доступа для примера в предыдущем разделе:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20);

integers.stream()
  .map(API.unchecked(i -> readFromFile(i)));

4. Использование Подъема

Чтобы изящно обработать Исключение IOException , мы можем ввести стандартные блоки try-catch внутри лямбда-выражения. Однако краткость лямбда-выражения будет потеряна. Подъем Вавра приходит нам на помощь.

Лифтинг-это концепция функционального программирования. Вы можете поднять частичную функцию до полной функции, которая возвращает параметр | в качестве результата.

Частичная функция-это функция, которая определена только для подмножества домена, в отличие от полной функции, которая определена для всей его области. Если частичная функция вызывается с входными данными, которые находятся за пределами ее диапазона поддержки, она обычно создает исключение.

Давайте перепишем пример из предыдущего раздела:

List integers = 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 :

List integers = 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 .