Java 8: Lambda-Streams und Ausnahmebehandlung
In Java 8 bringen Lambda-Ausdrücke viele Vorteile für die Stream-Verarbeitung. Beim Umgang mit Methoden, die geprüfte Ausnahmen auslösen, wie z. B. IOException, können Entwickler jedoch auf Kompilierungsfehler stoßen.
Beachten Sie den folgenden Code:
<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()); } }</code>
Der Code zielt darauf ab, eine Reihe aktivierter Ausnahmen abzurufen Kontonummern. Die Kompilierung schlägt jedoch fehl, da die Methoden isActive und getNumber IOExceptions auslösen, die in der Signatur abgefangen oder deklariert werden müssen.
Überprüfte Ausnahmen in Lambda-Ausdrücken abfangen
Zu Um dieses Problem zu beheben, müssen die geprüften Ausnahmen innerhalb des Lambda-Ausdrucks selbst behandelt werden. Es reicht jedoch nicht aus, einfach einen Try-Catch-Block innerhalb des Lambda zu platzieren. Die Ausnahme muss abgefangen werden, bevor sie den Gültigkeitsbereich des Lambda verlässt.
Verwenden eines UncheckedIOException-Wrappers
Ein Ansatz besteht darin, eine benutzerdefinierte Wrapper-Klasse, UncheckedIOException, zu verwenden, die geprüfte Ausnahmen konvertiert zu ungeprüften. Dadurch kann das Lambda die ungeprüfte Ausnahme auslösen und von den nachfolgenden Vorgängen des Streams verarbeitet werden.
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
Verwenden eines generischen Ausnahme-Wrappers
Eine andere Option ist die Verwendung von a generische Wrapper-Methode, uncheckCall, die jede Art von Ausnahme abfängt und sie als ungeprüfte Ausnahme erneut auslöst.
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet());</code>
In diesem Fall erhalten die nachfolgenden Vorgänge des Streams die ungeprüfte Ausnahme und können entsprechend behandelt werden.
Entschärfen der Ausnahmeprüfung des Compilers
Ein fortgeschrittenerer Ansatz beinhaltet die Verwendung einer Methode, die die Ausnahmeprüfung des Compilers effektiv deaktiviert. Dies erfordert jedoch Vorsicht und ein klares Verständnis der potenziellen Risiken. Bei diesem Ansatz wird der folgende Code verwendet:
<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>
Mit dieser Methode wird die überprüfte Ausnahme abgefangen und als Laufzeitausnahme erneut ausgelöst. Es ist jedoch wichtig zu beachten, dass dieser Ansatz zu unerwartetem Verhalten führen kann, wenn Ausnahmen an der Ausführungsstelle des Lambda behandelt werden sollen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit geprüften Ausnahmen in Java 8 Lambda Streams um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!