Java-обработка лямбда-исключений - PullRequest
0 голосов
/ 18 ноября 2018

У меня проблема с обработкой исключений, без использования try и catch, в лямбдах.

Я нашел пример кода, для которого мне нужно сделать свой собственный интерфейс Consumer, но он нене работает, и я не знаю, как это исправить.

import java.util.function.Consumer;

@FunctionalInterface
public interface ThrowingConsumer<T, E extends Exception> {
    void accept(T t) throws E;

    static <T> Consumer<T> throwingConsumerWrapper(
            ThrowingConsumer<T, Exception> throwingConsumer) {

        return i -> {
            try {
                throwingConsumer.accept(i);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        };
    }
}

Вот лямбда, в которой мне нужно обработать IOException.Это исключение должно быть выброшено из основного.Я не хочу использовать попытку и поймать main.

public static void main(String[] args) throws IOException {
    Function<String, List<String>> flines = fileName -> {
        Scanner scanner;
        ArrayList<String> wiersze = new ArrayList<>();
        File f = new File(fileName);

        scanner = new Scanner(f); // here :(

        while (scanner.hasNext()) {
            wiersze.add(scanner.nextLine());
        }

        scanner.close();

        return wiersze;
    };
}

Я новичок в Java, поэтому, пожалуйста, не могли бы вы объяснить мне, как решить эту проблему самым простым способом.

1 Ответ

0 голосов
/ 18 ноября 2018

Значит, ваша проблема в том, что у вас есть фрагмент кода, который генерирует проверенное исключение, и вы хотите, чтобы он стал реализацией объекта Function? Вы где-то нашли, как это сделать для Consumer, вам просто нужен адаптер кода для Function?

Предполагая, что перезапись должна выглядеть примерно так:

import java.util.function.Function;

@FunctionalInterface
public interface ThrowingFunction<T, R, EXC extends Exception> {
    R apply(T t) throws EXC;

    static <T> Function<T> throwingFunctionWrapper(
       ThrowingFunction<T, R, Exception> throwingFunction
    ) {
        return t -> {
            try {
                return throwingFunction.apply(t);
            } catch (Exception exc) {
                throw new RuntimeException(exc);
            }
        };
    }
}

Чтобы быть немного более общим, throwingFunctionWrapper может быть:

static <T> Function<T> throwingFunctionWrapper(
   ThrowingFunction<T, R, ? extends Exception> throwingFunction
) {

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

Развернуть (с исходным кодом) как:

try {
   ...
} catch (RuntimeException exc) { // subclass me !!
   throw (IOException)exc.getCause();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...