Ini adalah mungkin bagi Iterable.forEach()
(tetapi tidak andal dengan Stream.forEach()
). Solusinya adalah tidak baik, tetapi adalah mungkin.
PERINGATAN : Anda tidak boleh menggunakannya untuk mengendalikan logika bisnis, tetapi murni untuk menangani situasi luar biasa yang terjadi selama eksekusi forEach()
. Seperti sumber daya tiba-tiba berhenti diakses, salah satu objek yang diproses melanggar kontrak (mis. Kontrak mengatakan bahwa semua elemen dalam aliran tidak boleh null
tiba-tiba dan tidak terduga salah satunya null
) dll.
Menurut dokumentasi untuk Iterable.forEach()
:
Lakukan tindakan yang diberikan untuk setiap elemen Iterable
hingga semua elemen diproses atau tindakan melempar pengecualian ... Pengecualian yang dilemparkan oleh tindakan diteruskan ke pemanggil.
Jadi Anda melempar pengecualian yang akan segera memecah loop internal.
Kode akan menjadi seperti ini - saya tidak bisa mengatakan saya menyukainya tetapi berfungsi. Anda membuat kelas Anda sendiri BreakException
yang memanjang RuntimeException
.
try {
someObjects.forEach(obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
}
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
Perhatikan bahwa try...catch
adalah tidak sekitar ekspresi lambda, melainkan sekitar seluruh forEach()
metode. Untuk membuatnya lebih terlihat, lihat transkripsi kode berikut yang menunjukkan lebih jelas:
Consumer<? super SomeObject> action = obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
});
try {
someObjects.forEach(action);
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
for
pernyataan nyata .