En Oracle tutorial sobre colecciones https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html veo lo siguiente:
Use Iterator instead of the for-each construct when you need to:
1. Remove the current element. The for-each construct hides the iterator, so you cannot call remove. Therefore, the for-each construct is not usable for filtering.
2. Iterate over multiple collections in parallel.
Entiendo la primera opción 'eliminar elemento actual' que está soportado por iterador y no apoyada por para-cada constructo. Necesito una aclaración sobre la segunda opción 'iterar sobre colecciones múltiples en paralelo' que se pueden hacer con iterador y no por fines de cada uno. ¿Alguien puede suministrar un ejemplo de tal escenario? Por lo que yo entiendo la for-each también se pueden anidar, por lo que uno puede viajar en varias colecciones en paralelo.
Esto no es duplicado de iterador vs for-each y de iterador contra de lo que preguntan acerca de la comparación general de iterador y con fines de cada uno, y te pido por la condena específica en el tutorial de oráculo.
Suponga que tiene dos colecciones:
List<A> listA = /*...*/;
List<B> listB = /*...*/;
... y lo que necesita para iterar a través de ellos en paralelo (es decir, procesar la primera entrada de cada uno, y luego procesar la entrada siguiente en cada una, etc.) No se puede hacer eso con el aumento de for
bucle, que tendría que utilizar Iterator
s :
Iterator<A> itA = listA.iterator();
Iterator<B> itB = listB.iterator();
while (itA.hasNext() && itB.hasNext()) {
A nextA = itA.next();
B nextB = itB.next();
// ...do something with them...
}
Para ser justos, se puede combinar un aumento de for
bucle con un iterador:
Iterator<A> itA = listA.iterator();
for (B nextB : listB) {
if (!itA.hasNext()) {
break;
}
A nextA = itA.next();
// ...do something with them...
}
... pero es torpe y claridad sufre, sólo una de las colecciones pueden ser objeto de la for
, el resto tiene que ser Iterator
s.