Fungsi Lambda dan Pengendalian Pengecualian dalam Java 8
Dalam Java 8, fungsi lambda menyediakan sintaks ringkas untuk menentukan jenis fungsi. Walau bagaimanapun, isu biasa timbul apabila berurusan dengan fungsi lambda yang berpotensi membuang pengecualian yang telah diperiksa.
Pertimbangkan fungsi lambda berikut yang membuang IOException:
Integer myMethod(String s) throws IOException
Percubaan untuk membuat rujukan kepada ini kaedah menggunakan antara muka Fungsi standard akan mengakibatkan ralat penyusunan. Ini kerana antara muka Fungsi tidak mengisytiharkan sebarang pengecualian yang diperiksa, menjadikannya tidak serasi dengan kaedah seperti myMethod.
Untuk menangani isu ini, kami mempunyai beberapa pilihan:
Jika kod berada di bawah kawalan anda, anda boleh mentakrifkan tersuai antara muka berfungsi yang secara eksplisit mengisytiharkan pengecualian yang diperiksa. Contohnya:
@FunctionalInterface public interface CheckedFunction<T, R> { R apply(T t) throws IOException; }
Anda kemudian boleh menggunakan antara muka tersuai ini untuk merujuk myMethod:
void foo (CheckedFunction f) { ... }
Sebagai alternatif, anda boleh membungkus myMethod dalam kaedah baharu yang tidak membuang pengecualian yang ditandakan. Contohnya:
public Integer myWrappedMethod(String s) { try { return myMethod(s); } catch(IOException e) { throw new UncheckedIOException(e); } }
Sekarang, anda boleh merujuk kaedah yang dibalut ini menggunakan antara muka Fungsi:
Function<String, Integer> f = (String t) -> myWrappedMethod(t);
Sebagai pilihan terakhir, anda boleh menentukan badan fungsi lambda yang secara eksplisit mengendalikan pengecualian yang diperiksa. Contohnya:
Function<String, Integer> f = (String t) -> { try { return myMethod(t); } catch(IOException e) { throw new UncheckedIOException(e); } };
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Pengecualian yang Diperiksa dalam Fungsi Java 8 Lambda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!