После ответа Полмуррея я сам не был уверен, что произойдет с Исключением, выданным из замыкания, поэтому я создал тестовый пример JUnit, о котором легко подумать:
class TestCaseForThrowingExceptionFromInsideClosure {
@Test
void testEearlyReturnViaException() {
try {
[ 'a', 'b', 'c', 'd' ].each {
System.out.println(it)
if (it == 'c') {
throw new Exception("Found c")
}
}
}
catch (Exception exe) {
System.out.println(exe.message)
}
}
}
Вывод выше:
a
b
c
Found c
Но помните, что "нельзя использовать исключения для управления потоком" , см., В частности, вопрос переполнения стека: Почему бы не использовать исключения в качестве регулярного потока управления?
Так что вышеприведенное решение в любом случае не идеально. Просто используйте:
class TestCaseForThrowingExceptionFromInsideClosure {
@Test
void testEarlyReturnViaFind() {
def curSolution
[ 'a', 'b', 'c', 'd' ].find {
System.out.println(it)
curSolution = it
return (it == 'c') // if true is returned, find() stops
}
System.out.println("Found ${curSolution}")
}
}
Вывод вышеупомянутого также:
a
b
c
Found c