Anda sebenarnya dapat memperluas Consumer
(dan Function
lain - lain) dengan antarmuka baru yang menangani pengecualian - menggunakan metode default Java 8 !
Pertimbangkan antarmuka ini (meluas Consumer
):
@FunctionalInterface
public interface ThrowingConsumer<T> extends Consumer<T> {
@Override
default void accept(final T elem) {
try {
acceptThrows(elem);
} catch (final Exception e) {
// Implement your own exception handling logic here..
// For example:
System.out.println("handling an exception...");
// Or ...
throw new RuntimeException(e);
}
}
void acceptThrows(T elem) throws Exception;
}
Kemudian, misalnya, jika Anda memiliki daftar:
final List<String> list = Arrays.asList("A", "B", "C");
Jika Anda ingin mengkonsumsinya (mis. Dengan forEach
) dengan beberapa kode yang melempar pengecualian, Anda biasanya telah menyiapkan blok coba / tangkap:
final Consumer<String> consumer = aps -> {
try {
// maybe some other code here...
throw new Exception("asdas");
} catch (final Exception ex) {
System.out.println("handling an exception...");
}
};
list.forEach(consumer);
Tetapi dengan antarmuka baru ini, Anda bisa instantiate dengan ekspresi lambda dan kompiler tidak akan mengeluh:
final ThrowingConsumer<String> throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");
};
list.forEach(throwingConsumer);
Atau bahkan hanya melemparkannya agar lebih ringkas !:
list.forEach((ThrowingConsumer<String>) aps -> {
// maybe some other code here...
throw new Exception("asda");
});
Pembaruan : Sepertinya ada bagian perpustakaan utilitas yang sangat bagus dari Durian yang disebut Kesalahan yang dapat digunakan untuk menyelesaikan masalah ini dengan lebih banyak fleksibilitas. Sebagai contoh, dalam implementasi saya di atas saya telah secara eksplisit mendefinisikan kebijakan penanganan kesalahan ( System.out...
atau throw RuntimeException
), sedangkan Kesalahan Durian memungkinkan Anda untuk menerapkan kebijakan dengan cepat melalui serangkaian metode utilitas yang besar. Terima kasih telah berbagi , @NedTwigg !.
Penggunaan sampel:
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));