Bu ise mümkün Iterable.forEach()
(ancak güvenilir olan Stream.forEach()
). Solüsyon hoş değil, ama bir mümkün.
UYARI : İş mantığını kontrol etmek için değil, yalnızca uygulamasının gerçekleşmesi sırasında ortaya çıkan istisnai bir durumu ele almak için kullanmalısınız forEach()
. Bir kaynağın aniden erişilebilir olması gibi, işlenen nesnelerden biri bir sözleşmeyi ihlal ediyor (örneğin sözleşme, akıştaki tüm öğelerin null
değil, aniden ve beklenmedik bir şekilde bunlardan biri olması gerektiğini söylüyor null
) vb.
İçin belgelere göre Iterable.forEach()
:
Tüm öğeler işleninceye veya eylem bir istisna Iterable
atana kadar verilen her eylem için verilen eylemi gerçekleştirir ... Eylem tarafından atılan istisnalar arayana aktarılır.
Böylece, iç döngüyü derhal kıracak bir istisna atarsınız.
Kod böyle bir şey olacak - Sevdim diyemem ama işe yarıyor. Kendi sınıfınızı BreakException
yaratırsınız 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
}
O Bildirimi try...catch
olduğu değil doğrusu etrafında bütün etrafında lambda ifadesi, ancak forEach()
yöntem. Daha görünür hale getirmek için, kodu daha net gösteren aşağıdaki transkripsiyonuna bakın:
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
ifade kullanın .