Heim  >  Artikel  >  Java  >  Wie gehe ich mit geprüften Ausnahmen in Java 8 Lambda Streams um?

Wie gehe ich mit geprüften Ausnahmen in Java 8 Lambda Streams um?

Barbara Streisand
Barbara StreisandOriginal
2024-10-27 04:04:03407Durchsuche

How to Handle Checked Exceptions in Java 8 Lambda Streams?

Java 8: Lambda-Streams und Ausnahmebehandlung

In Java 8 bringen Lambda-Ausdrücke viele Vorteile für die Stream-Verarbeitung. Beim Umgang mit Methoden, die geprüfte Ausnahmen auslösen, wie z. B. IOException, können Entwickler jedoch auf Kompilierungsfehler stoßen.

Beachten Sie den folgenden Code:

<code class="java">class Bank {
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s = accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
}</code>

Der Code zielt darauf ab, eine Reihe aktivierter Ausnahmen abzurufen Kontonummern. Die Kompilierung schlägt jedoch fehl, da die Methoden isActive und getNumber IOExceptions auslösen, die in der Signatur abgefangen oder deklariert werden müssen.

Überprüfte Ausnahmen in Lambda-Ausdrücken abfangen

Zu Um dieses Problem zu beheben, müssen die geprüften Ausnahmen innerhalb des Lambda-Ausdrucks selbst behandelt werden. Es reicht jedoch nicht aus, einfach einen Try-Catch-Block innerhalb des Lambda zu platzieren. Die Ausnahme muss abgefangen werden, bevor sie den Gültigkeitsbereich des Lambda verlässt.

Verwenden eines UncheckedIOException-Wrappers

Ein Ansatz besteht darin, eine benutzerdefinierte Wrapper-Klasse, UncheckedIOException, zu verwenden, die geprüfte Ausnahmen konvertiert zu ungeprüften. Dadurch kann das Lambda die ungeprüfte Ausnahme auslösen und von den nachfolgenden Vorgängen des Streams verarbeitet werden.

<code class="java">s = s.filter(a -> {
    try {
        return a.isActive();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});</code>

Verwenden eines generischen Ausnahme-Wrappers

Eine andere Option ist die Verwendung von a generische Wrapper-Methode, uncheckCall, die jede Art von Ausnahme abfängt und sie als ungeprüfte Ausnahme erneut auslöst.

<code class="java">return s.filter(a -> uncheckCall(a::isActive))
        .map(Account::getNumber)
        .collect(toSet());</code>

In diesem Fall erhalten die nachfolgenden Vorgänge des Streams die ungeprüfte Ausnahme und können entsprechend behandelt werden.

Entschärfen der Ausnahmeprüfung des Compilers

Ein fortgeschrittenerer Ansatz beinhaltet die Verwendung einer Methode, die die Ausnahmeprüfung des Compilers effektiv deaktiviert. Dies erfordert jedoch Vorsicht und ein klares Verständnis der potenziellen Risiken. Bei diesem Ansatz wird der folgende Code verwendet:

<code class="java">public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (Exception e) {
        sneakyThrow(e);
        return null; // Unreachable but needed to satisfy compiler
    }
}</code>

Mit dieser Methode wird die überprüfte Ausnahme abgefangen und als Laufzeitausnahme erneut ausgelöst. Es ist jedoch wichtig zu beachten, dass dieser Ansatz zu unerwartetem Verhalten führen kann, wenn Ausnahmen an der Ausführungsstelle des Lambda behandelt werden sollen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit geprüften Ausnahmen in Java 8 Lambda Streams um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn