Heim > Java > javaLernprogramm > Hauptteil

Wie behandelt man Ausnahmen in Java 8 Lambda-Ausdrücken beim Filtern von Streams?

Patricia Arquette
Freigeben: 2024-10-26 04:54:03
Original
837 Leute haben es durchsucht

How to Handle Exceptions in Java 8 Lambda Expressions When Filtering Streams?

Java 8: Lambda-Streams – Filtern nach Methode, die Ausnahmen auslöst

Die Lambda-Ausdrücke von Java 8 bieten leistungsstarke Möglichkeiten zur Manipulation und Verarbeitung von Daten. Beim Umgang mit Methoden, die Ausnahmen auslösen können, ist es jedoch wichtig, die Einschränkungen von Lambda-Ausdrücken zu überwinden und effektive Lösungen zu erkunden.

Das Problem:

Bedenken Sie den folgenden Code Fragment:

<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 aufgrund der geprüften Ausnahmen, die von den Methoden isActive und getNumber ausgelöst werden, nicht kompiliert werden. Es reicht nicht aus, die Ausnahmen einfach in einem umgebenden Try-Catch-Block abzufangen, da die Ausnahmen in den Lambda-Ausdrücken nicht ordnungsgemäß behandelt werden.

Die Lösung:

Zu überwinden Bei diesem Problem müssen wir die Ausnahmen abfangen, bevor sie dem Lambda-Ausdruck entgehen. Ein Ansatz besteht darin, eine ungeprüfte Ausnahme zu verwenden, wie im folgenden modifizierten Codefragment zu sehen ist:

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

Hier fangen wir die IOException im Lambda ab und lösen eine ungeprüfte Ausnahme aus, um sicherzustellen, dass sie im Lambda ordnungsgemäß behandelt wird Ausdruck.

Alternativ können wir eine Wrapper-Methode verwenden, die geprüfte Ausnahmen in ungeprüfte übersetzt:

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

public static <T> T uncheckCall(Callable<T> callable) {
    try {
        return callable.call();
    } catch (RuntimeException e) {
        throw e;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}</code>
Nach dem Login kopieren

Dadurch können wir den Lambda-Ausdruck in einen Aufruf von uncheckCall einschließen, der die behandelt überprüfte Ausnahmen intern, sodass der Lambda-Ausdruck frei von geprüften Ausnahmedeklarationen bleibt.

Weitere Überlegungen:

Es ist wichtig, sich der Tatsache bewusst zu sein, dass bestimmte Ausnahmen dem immer noch entkommen können Lambda-Ausdruck, auch mit den vorgeschlagenen Lösungen. Beispielsweise werden Ausnahmen, die während der Auswertung des Sammelvorgangs ausgelöst werden, weiterhin aus dem Lambda weitergegeben.

Das obige ist der detaillierte Inhalt vonWie behandelt man Ausnahmen in Java 8 Lambda-Ausdrücken beim Filtern von Streams?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!