이것은 이다 가능 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진술을 사용하십시오 .