Heim > Java > javaLernprogramm > Hauptteil

Wie gehe ich mit geprüften Ausnahmen um, wenn Lambda-Ausdrücke mit Streams in Java 8 verwendet werden?

DDD
Freigeben: 2024-10-27 05:06:30
Original
1135 Leute haben es durchsucht

How to Handle Checked Exceptions When Using Lambda Expressions with Streams in Java 8?

Java 8: Lambda-Streams, Filterung nach Methode mit Ausnahmebehandlung

In Java 8 filtern Lambda-Ausdrücke in Streams effizient Elemente. Beim Umgang mit Methoden, die geprüfte Ausnahmen wie IOException auslösen, können jedoch Komplikationen auftreten.

Der folgende Codeausschnitt veranschaulicht dieses Problem:

<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());
    }
}
interface Account {
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
}</code>
Nach dem Login kopieren

Dieser Code kann nicht kompiliert werden, da er das nicht verarbeiten kann IOException, die von den Methoden isActive und getNumber innerhalb der Lambda-Ausdrücke ausgelöst wird.

Um dies zu beheben, müssen wir die Ausnahme abfangen, bevor sie dem Lambda entgeht:

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

Da das Lambda ausgewertet wird In einem anderen Kontext, in dem die geprüfte Ausnahme nicht deklariert ist, verpacken wir die geprüfte Ausnahme in eine ungeprüfte Ausnahme.

Alternativ können Sie eine Methode verwenden, die die Ausnahmeprüfung des Compilers entschärft:

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

Wobei uncheckCall wie folgt definiert ist:

<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

Diese Methode wandelt geprüfte Ausnahmen effektiv in ungeprüfte um. Es sollte jedoch mit Vorsicht verwendet werden, da es bei unsachgemäßer Handhabung zu unerwartetem Verhalten führen kann.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit geprüften Ausnahmen um, wenn Lambda-Ausdrücke mit Streams in Java 8 verwendet werden?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage