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