Rumah > Java > javaTutorial > teks badan

Bagaimana Mengendalikan Pengecualian yang Diperiksa Apabila Menggunakan Ungkapan Lambda dengan Strim dalam Java 8?

DDD
Lepaskan: 2024-10-27 05:06:30
asal
1135 orang telah melayarinya

How to Handle Checked Exceptions When Using Lambda Expressions with Streams in Java 8?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan