streams matriz loop how for java refactoring foreach

matriz - how to use a foreach loop in java



Cómo romper múltiples foreach loop? (9)

Esta pregunta ya tiene una respuesta aquí:

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

Ver Declaración de ruptura