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

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

DDD
DDDOriginal
2024-10-27 05:06:30994Durchsuche

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>

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>

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>

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>

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!

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