Solo se puede admitir continuar limpiamente, no romper. Especialmente con cosas como EachLine y cada uno. La incapacidad para soportar la interrupción tiene que ver con la forma en que se evalúan esos métodos, no se tiene en cuenta la finalización del ciclo que se puede comunicar al método. Aquí se explica cómo admitir continue:
Mejor enfoque (suponiendo que no necesita el valor resultante).
revs.eachLine { line ->
if (line ==~ /-{28}/) {
return // returns from the closure
}
}
Si su muestra es así de simple, esto es bueno para la legibilidad.
revs.eachLine { line ->
if (!(line ==~ /-{28}/)) {
// do what you would normally do
}
}
otra opción, simula lo que normalmente haría una continuación en un nivel de bytecode.
revs.eachLine { line ->
while (true) {
if (line ==~ /-{28}/) {
break
}
// rest of normal code
break
}
}
Una posible manera de apoyar ruptura es a través de excepciones:
try {
revs.eachLine { line ->
if (line ==~ /-{28}/) {
throw new Exception("Break")
}
}
} catch (Exception e) { } // just drop the exception
Es posible que desee utilizar un tipo de excepción personalizada para evitar enmascarar otras excepciones reales, especialmente si usted tiene otro tratamiento que se realice en ese clase que podría arrojar excepciones reales, como NumberFormatExceptions o IOExceptions.
El uso de excepciones para controlar el flujo del programa es una mala idea. Crear excepciones requiere tomar una instantánea de la pila de llamadas, y eso es costoso. –
No si anula el método que genera la pila de llamadas en la excepción que arroja para no hacer nada. Esa es la ventaja de una excepción personalizada. – shemnon
Eso también es un paso adicional en un esfuerzo por solucionar un problema que no tendrías si usaras un cierre como un cierre en lugar de considerarlo una construcción de lazo. El ejemplo anterior se beneficiaría más si se fijara la intención general poco clara de la lógica para filtrar líneas o encontrar una línea. – Cliff