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!