এই হল সম্ভব Iterable.forEach()
(কিন্তু নির্ভরযোগ্যভাবে না সঙ্গে Stream.forEach()
)। সমাধান সুন্দর না, কিন্তু এটা হয় সম্ভব।
সতর্কতা : আপনার ব্যবসার যুক্তি নিয়ন্ত্রণের জন্য এটি ব্যবহার করা উচিত নয়, তবে খালি কার্যকর করার সময় ঘটে যাওয়া ব্যতিক্রমী পরিস্থিতি পরিচালনার জন্য forEach()
। যেমন কোনও উত্স হঠাৎ অ্যাক্সেসযোগ্য হয়ে যাওয়া বন্ধ করে দেয়, প্রক্রিয়াজাত জিনিসগুলির মধ্যে একটি চুক্তি লঙ্ঘন করছে (উদাহরণস্বরূপ চুক্তি বলে যে স্ট্রিমের সমস্ত উপাদান অবশ্যই হওয়া উচিত নয় null
তবে হঠাৎ এবং অপ্রত্যাশিতভাবে সেগুলির মধ্যে একটি null
) ইত্যাদি etc.
ডকুমেন্টেশন অনুসারে 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
বিবৃতি ব্যবহার করুন ।