Одна из распространенных проблем при работе с лямбда-функциями в Java 8 связана с их неспособностью обрабатывать проверяемые исключения. Давайте рассмотрим пример.
Функциональный интерфейс Function<T,R> обычно используется для создания лямбда-функций, которые принимают один аргумент типа T и возвращают результат типа R.
Function<String, Integer> function = str -> Integer.parseInt(str);
В этом примере лямбда-функция преобразует строку в целое число. Однако, что произойдет, если нам нужно вызвать метод, который может вызвать проверяемое исключение? Например:
Integer myMethod(String s) throws IOException
Если попытаться включить вызов этого метода в лямбда-функцию, компилятор Java выдаст ошибку, поскольку Function не предназначен для обработки проверяемых исключений.
Существует несколько способов обойти это ограничение. Один из них — создать собственный функциональный интерфейс, который может обрабатывать исключения.
@FunctionalInterface
public interface ThrowingFunction<T, R, E extends Exception> {
R apply(T t) throws E;
}
Здесь ThrowingFunction — это функциональный интерфейс, который может принимать аргумент типа T, возвращать результат типа R и вызывать исключение типа E.
Теперь можно использовать ThrowingFunction для создания лямбда-функций, которые могут вызывать проверяемые исключения.
ThrowingFunction<String, Integer, IOException> function = str -> myMethod(str);
Другой способ — использовать блок try-catch внутри лямбда-функции для перехвата и обработки исключений.
Function<String, Integer> function = str -> {
try {
return myMethod(str);
} catch (IOException e) {
throw new RuntimeException(e);
}
};
В этом случае все проверяемые исключения, вызванные внутри лямбда-функции, будут обернуты в непроверяемое исключение и выброшены.
Перейти в телеграм, чтобы получить результаты теста



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