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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 04:54:03820Durchsuche

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>

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>

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>

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!

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