Java 8: Lambda-Streams, Penapisan mengikut Kaedah dengan Pengendalian Pengecualian
Dalam Java 8, ungkapan lambda dalam strim menapis elemen dengan cekap. Walau bagaimanapun, apabila berurusan dengan kaedah yang membuang pengecualian yang diperiksa seperti IOException, komplikasi boleh timbul.
Coretan kod berikut menunjukkan isu ini:
<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>
Kod ini gagal disusun kerana ia tidak dapat mengendalikan IOException yang dilemparkan oleh kaedah isActive dan getNumber dalam ungkapan lambda.
Untuk menyelesaikan masalah ini, kita perlu menangkap pengecualian sebelum ia melarikan diri dari lambda:
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
Memandangkan lambda dinilai dalam konteks yang berbeza di mana pengecualian yang ditandai tidak diisytiharkan, kami membalut pengecualian yang ditandakan dalam satu yang tidak ditandakan.
Sebagai alternatif, anda boleh menggunakan kaedah yang meredakan semakan pengecualian pengkompil:
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet());</code>
Di mana uncheckCall ditakrifkan sebagai:
<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>
Kaedah ini dengan berkesan menukarkan pengecualian yang ditandakan kepada yang tidak ditanda. Walau bagaimanapun, ia harus digunakan dengan berhati-hati, kerana ia boleh membawa kepada tingkah laku yang tidak dijangka jika tidak dikendalikan dengan betul.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Pengecualian yang Diperiksa Apabila Menggunakan Ungkapan Lambda dengan Strim dalam Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!