Isso é possível para Iterable.forEach()
(mas não de maneira confiável Stream.forEach()
). A solução não é boa, mas é possível.
AVISO : Você não deve usá-lo para controlar a lógica de negócios, mas apenas para lidar com uma situação excepcional que ocorre durante a execução do forEach()
. Como um recurso repentinamente deixa de ser acessível, um dos objetos processados está violando um contrato (por exemplo, o contrato diz que todos os elementos no fluxo não devem ser, de maneira null
repentina e inesperada, um deles é null
) etc.
De acordo com a documentação para Iterable.forEach()
:
Executa a ação especificada para cada elemento do Iterable
até que todos os elementos tenham sido processados ou a ação lança uma exceção ... As exceções lançadas pela ação são retransmitidas para o chamador.
Então você lança uma exceção que interrompe imediatamente o loop interno.
O código será algo assim - não posso dizer que gosto, mas funciona. Você cria sua própria classe BreakException
que se estende 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
}
Observe que o nãotry...catch
está relacionado à expressão lambda, mas ao redor de todo o método. Para torná-lo mais visível, consulte a seguinte transcrição do código que mostra mais claramente: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
declaração real .