สิ่งนี้เป็นไปได้สำหรับIterable.forEach()(แต่ไม่น่าเชื่อถือด้วยStream.forEach()) การแก้ปัญหาไม่ดี แต่มันก็เป็นไปได้
คำเตือน : คุณไม่ควรจะใช้มันในการควบคุมตรรกะทางธุรกิจ forEach()แต่อย่างหมดจดสำหรับการจัดการสถานการณ์พิเศษที่เกิดขึ้นในระหว่างการดำเนินการ เช่นทรัพยากรหยุดกระทันหันการเข้าถึงวัตถุที่ถูกประมวลผลอย่างใดอย่างหนึ่งกำลังละเมิดสัญญา (เช่นสัญญาบอกว่าองค์ประกอบทั้งหมดในสตรีมต้องไม่เป็นnullแต่ทันใดนั้นและโดยไม่คาดคิดหนึ่งในนั้นคือnull ) เป็นต้น
ตามเอกสารสำหรับIterable.forEach():
ดำเนินการกับการกระทำที่กำหนดสำหรับแต่ละองค์ประกอบของIterable จนกว่าองค์ประกอบทั้งหมดจะได้รับการประมวลผลหรือการกระทำที่เกิดข้อยกเว้น ... ข้อยกเว้นโยนโดยการกระทำจะถูกส่งไปยังผู้โทร
ดังนั้นคุณจะโยนข้อยกเว้นซึ่งจะทำลายลูปภายในทันที
รหัสจะเป็นแบบนี้ - ฉันไม่สามารถพูดได้ว่าฉันชอบแต่มันใช้งานได้ คุณสามารถสร้างระดับของคุณเองซึ่งทอดตัวBreakExceptionRuntimeException
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คำสั่ง