สิ่งนี้เป็นไปได้สำหรับ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
คำสั่ง