matriz - how to use a foreach loop in java
Cómo romper múltiples foreach loop? (9)
Esta pregunta ya tiene una respuesta aquí:
- Rompiendo bucles anidados en Java 30 respuestas
Tengo cuatro bucles foreach que se repiten en las colecciones y, en función de una condición, hacen algo. Aquí está el código que estoy escribiendo ahora:
boolean breakFlag = false;
String valueFromObj2 = null;
String valueFromObj4 = null;
for(Object1 object1: objects){
for(Object2 object2: object1){
//I get some value from object2
valueFromObj2 = object2.getSomeValue();
for(Object3 object3 : object2){
for(Object4 object4: object3){
//Finally I get some value from Object4.
valueFromObj4 = object4.getSomeValue();
//Compare with valueFromObj2 to decide either to break all the foreach loop
breakFlag = compareTwoVariable(valueFromObj2, valueFromObj4 );
if(breakFlag){break;}
}//fourth loop ends here
if(breakFlag){break;}
}//third loop ends here
if(breakFlag){break;}
}//second loop ends here
if(breakFlag){break;}
}//first loop ends here
El objeto principal (objetos en el código) proviene de un proveedor externo SDK, por lo que no puedo cambiar nada en esa parte. Quiero preguntarle a la comunidad stackoverflow si hay un mejor enfoque para romper los cuatro ciclos foreach. O si hay alguna otra forma de refactorizar este código para hacerlo más legible y mantenible. Gracias.
Extraiga todos los bucles en la función y use return.
La solución directa es poner todo el proceso de búsqueda en un método y return
tan pronto como tenga una respuesta.
Sin embargo, la forma abstracta de su código de muestra deja en cuestión otras posibilidades. Por ejemplo, ¿hay alguna manera de "indexar" parte del contenido (por ejemplo, usando instancias de Map
) para que no tenga que usar bucles de fuerza bruta?
Lanzar una excepción y atraparlo fuera de los bucles? Use algo que sea "considerado dañino"
Es un poco gracioso cuando la ciencia de la computación se pinta en una esquina ;-)
Utilice una etiqueta en el bucle más externo e incluya esta etiqueta en la declaración de break
cuando desee saltar de todos los bucles. En el siguiente ejemplo, modifiqué tu código para usar la etiqueta OUTERMOST
:
String valueFromObj2 = null;
String valueFromObj4 = null;
OUTERMOST: for(Object1 object1: objects){
for(Object2 object2: object1){
//I get some value from object2
valueFromObj2 = object2.getSomeValue();
for(Object3 object3 : object2){
for(Object4 object4: object3){
//Finally I get some value from Object4.
valueFromObj4 = object4.getSomeValue();
//Compare with valueFromObj2 to decide either to break all the foreach loop
if( compareTwoVariable(valueFromObj2, valueFromObj4 )) {
break OUTERMOST;
}
}//fourth loop ends here
}//third loop ends here
}//second loop ends here
}//first loop ends here
Vea el Tutorial de Java de Branching Statements de la manera más fácil, usando una etiqueta. Puede etiquetar uno o todos los bucles for, luego usar break
o continue
junto con esas etiquetas.
Una alternativa al uso de etiquetas es usar return
en return
lugar. Simplemente refactorice su código en una llamada a método para evitar la necesidad de usar etiquetas.
Su ejemplo es bastante genérico, por lo que es difícil decir lo que está pasando, pero obtengo un olor a código tan fuerte del código que me proporcionó que me veo obligado a pensar que tiene que haber otra manera de hacerlo completamente, muy probablemente a través de refactorizar la estructura de datos real a algo más significativo.
¿Qué tipo de lista de objects
es? ¿Qué otros datos (más importantes) contiene? Si no es demasiado complicado, te agradecería si me proporcionas un código más relevante ya que el refactorizador en mí se está mareando al ver ese montón de bucles.
Una forma de romper o colapsar varias instrucciones (en realidad apilar marcos) es arrojar una excepción, pero esto no se recomienda porque es realmente costoso para el tiempo de ejecución desenrollar la pila y podría llevar a un comportamiento indefinido muy difícil de depurar, (Mantén esto en mente).
De lo contrario, lo que recomiendo, vuelva a escribir ese código para poder salir del bucle de una manera elegante. Si no puede cambiar este código de otra manera, entonces tendrá que dar lugar a excepciones ...
Podría usar una declaración de rotura etiquetada. Este tipo de interrupción termina una declaración externa
Además del hecho de que Java admite el break etiquetado, ver también ¿Es posible salir de a for before time en C ++, si se alcanza una condición final? que es una pregunta similar con algunas otras soluciones relevantes.