यह है के लिए संभव Iterable.forEach()
है (लेकिन मज़बूती से नहीं के साथ Stream.forEach()
)। समाधान अच्छा नहीं है, लेकिन यह है संभव।
चेतावनी : आपको इसका उपयोग व्यावसायिक तर्क को नियंत्रित करने के लिए नहीं करना चाहिए, बल्कि विशुद्ध रूप से एक असाधारण स्थिति को संभालने के लिए करना चाहिए जो कि निष्पादन के दौरान होता है forEach()
। जैसे कि एक संसाधन अचानक सुलभ होना बंद हो जाता है, संसाधित वस्तुओं में से एक अनुबंध का उल्लंघन कर रहा है (जैसे अनुबंध कहता है कि धारा में सभी तत्व नहीं होने चाहिए null
लेकिन अचानक और अप्रत्याशित रूप से उनमें से एक है)null
) आदि।
के लिए प्रलेखन के अनुसार Iterable.forEach()
:
Iterable
जब तक सभी तत्वों को संसाधित नहीं किया जाता है तब तक प्रत्येक तत्व के लिए दी गई कार्रवाई करता है या कार्रवाई एक अपवाद को फेंक देती है ... कार्रवाई द्वारा फेंके गए अपवाद कॉल करने वाले को रिले किए जाते हैं।
तो आप एक अपवाद फेंकते हैं जो तुरंत आंतरिक लूप को तोड़ देगा।
कोड कुछ इस तरह होगा - मैं यह नहीं कह सकता कि मुझे यह पसंद है लेकिन यह काम करता है। आप अपनी खुद की क्लास बनाएँ BreakException
जो फैली हुई हो 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
}
गौर करें कि द try...catch
है नहीं आसपास लैम्ब्डा अभिव्यक्ति पूरे, बल्कि आसपास forEach()
विधि। इसे अधिक दृश्यमान बनाने के लिए, कोड का निम्नलिखित प्रतिलेखन देखें जो इसे और अधिक स्पष्ट रूप से दिखाता है:
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
बयान का उपयोग करें ।