Heim > Java > javaLernprogramm > Hauptteil

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

Barbara Streisand
Freigeben: 2024-10-27 04:04:03
Original
502 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage