loop for enhanced java foreach

enhanced - foreach javascript



¿Cuáles son las ventajas de Enhanced for loop and Iterator en Java? (12)

¡Menos tipeo! Más ayuda del compilador

¿alguien puede por favor especificarme cuáles son las ventajas de Enhanced for loop y Iterators en java +5?


¡Una sintaxis más limpia! No hay diferencia desde la perspectiva del rendimiento ya que esto es solo una conveniencia para un programador.


Como otros dijeron, el bucle for mejorado proporciona una sintaxis más limpia, código legible y menos tipo.

Además, evita el posible escenario de error ''índice fuera de límite'' también. Por ejemplo, cuando itera manualmente una lista, puede usar la variable de índice de forma incorrecta, como:

for(int i=0; i<= list.size(); i++)

que arrojará excepción. Pero en el caso de Enhanced for loop, estamos dejando la tarea iterativa al compilador. Evita por completo el caso de error.


Como otros ya responden, es un azúcar de sintaxis para el limpiador. Si se compara con el bucle del iterador de clase, encontrará una variable menos que tendrá que declarar.


Creo que está casi resumido en la página de documentación que lo presenta here .

Iterar sobre una colección es más feo de lo que necesita ser

Tan verdadero..

El iterador es solo desorden. Además, es una oportunidad de error. La variable del iterador aparece tres veces en cada bucle: son dos posibilidades de equivocarse. La construcción for-each se deshace del desorden y la oportunidad de error.

Exactamente

Cuando vea los dos puntos (:), léalo como "in". El ciclo anterior se lee como "para cada TimerTask t en c". Como puede ver, el constructo for-each combina maravillosamente con los genéricos. Conserva todo tipo de seguridad, mientras elimina el resto del desorden. Como no tiene que declarar el iterador, no tiene que proporcionar una declaración genérica para él. (El compilador hace esto por ti a tus espaldas, pero no debes preocuparte por eso).

Me gustaría resumirlo más, pero creo que esa página lo hace bastante perfectamente.


El for-loop mejorado ofrece la siguiente ventaja principal:

for (int i=0; i <= list.size(); i++)

Elimina el cálculo repetido de list.size() en cada iteración en la versión anterior no mejorada. Esta es una ventaja de rendimiento que importa.

Alternativamente, puede calcular el tamaño fuera del ciclo de la siguiente manera usando una variable adicional:

int size = list.size(); for (int i=0; i <= size; i++)


El mayor inconveniente es la creación de un Iterador, que no está allí con un bucle basado en índice. Por lo general, está bien, pero en las secciones de rendimiento crítico (en una aplicación en tiempo real, por ejemplo, cuando tiene que ejecutarse varias cientos de veces por segundo), puede causar una intervención importante del GC ...


Es más conciso El único problema es la comprobación nula.

for (String str : strs) { // make sure strs is not null here // Do whatever }


Las fortalezas y las debilidades se resumen bastante bien en Stephen Colebourne (Joda-Time, JSR-310, etc.) Mejorado para cada propuesta de control de iteración de bucle para extenderlo en Java 7:

RESUMEN DE LA CARACTERÍSTICA:

Extiende el bucle de Java 5 for-each para permitir el acceso al índice de bucle, ya sea esta es la primera o la última iteración, y para eliminar el elemento actual.

VENTAJA MAYOR

El bucle for-each es casi con certeza la característica popular más nueva de Java 5. Funciona porque aumenta el nivel de abstracción, en lugar de tener que expresar los detalles de bajo nivel de cómo recorrer una lista o matriz (con un índice o iterador), el desarrollador simplemente declara que quiere hacer un bucle y el lenguaje se ocupa del resto. Sin embargo, todo el beneficio se pierde tan pronto como el desarrollador necesite acceder al índice o eliminar un artículo .

El Java 5 original para cada trabajo tomó una postura relativamente conservadora en una serie de cuestiones con el objetivo de abordar el caso del 80%. Sin embargo, los bucles son una forma tan común en la codificación que el 20% restante que no se abordó representa un cuerpo significativo de código.

El proceso de convertir el bucle de regreso para que cada uno sea indexado o basado en iteradores es doloroso. Esto se debe a que el antiguo estilo de bucle, si es significativamente de nivel inferior, es más detallado y menos claro . También es doloroso ya que la mayoría de los IDE no admiten este tipo de ''refactorización''.

MAYOR BENEFICIO:

Una expresión de codificación común se expresa en una abstracción más alta que en la actualidad. Esto ayuda a la legibilidad y la claridad .

...

En resumen, el bucle for mejorado ofrece una sintaxis concisa de nivel superior para recorrer una lista o matriz que mejora la claridad y la legibilidad. Sin embargo, omite algunas partes: permite acceder al bucle de índice o eliminar un elemento.

Ver también


Para mí, está claro, la principal ventaja es la legibilidad.

for(Integer i : list){ .... }

es claramente mejor que algo así como

for(int i=0; i < list.size(); ++i){ .... }


Puede iterar sobre cualquier colección que sea Iterable y también arrays. Y la diferencia de rendimiento no es algo de lo que deba preocuparse en absoluto.

La legibilidad es importante.

Prefer this for (String s : listofStrings) { ... } over for (Iterator<String> iter = listofStrings.iterator(); iter.hasNext(); ) { String s = iter.next(); ... }

Tenga en cuenta que si necesita eliminar elementos mientras itera, debe usar Iterator .

Por ejemplo,

List<String> list = getMyListofStrings(); for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) { String s = iter.next(); if (someCondition) { iter.remove(); } }

No puede usar for(String s : myList) para eliminar un elemento en la lista.
También tenga en cuenta que al iterar a través de una matriz, foreach (o mejorado para) solo se puede utilizar para obtener los elementos, no puede modificar los elementos en la matriz.
Para más información, mira this .


Un bucle foreach / enhanced for / for sirve para proporcionar un cursor sobre un objeto de datos. Esto es particularmente útil cuando piensa en términos de "recorrer un archivo línea por línea" o "recorrer un registro de conjunto de resultados por registro", ya que es simple y sencillo de implementar.

Esto también proporciona una forma más general y mejorada de iteración en comparación con los métodos basados ​​en índices porque ya no es necesario que el llamante (para el bucle) sepa cómo se obtienen los valores o los tamaños de recopilación u otros detalles de implementación.