Asegúrate de que esto no sea un olor a código. ¿Es posible invertir la lógica y ser "inclusivo" en lugar de "exclusivo"?
List<String> names = ....
List<String> reducedNames = ....
for (String name : names) {
// Do something
if (conditionToIncludeMet)
reducedNames.add(name);
}
return reducedNames;
La situación que me llevó a esta página de códigos de edad involucrados que bucle a través de una lista usando indecies para eliminar los elementos de la lista. Quería refactorizarlo para usar el estilo foreach.
Pasó por una lista completa de elementos para verificar a cuáles tenía permiso de acceso el usuario, y eliminó los que no tenían permiso de la lista.
List<Service> services = ...
for (int i=0; i<services.size(); i++) {
if (!isServicePermitted(user, services.get(i)))
services.remove(i);
}
Para revertir esto y no usar el remove:
List<Service> services = ...
List<Service> permittedServices = ...
for (Service service:services) {
if (isServicePermitted(user, service))
permittedServices.add(service);
}
return permittedServices;
Cuando se "eliminar" debe preferirse? Una consideración es si hay una gran lista o un "agregado" caro, combinado con solo unos pocos eliminados en comparación con el tamaño de la lista. Puede ser más eficiente hacer solo algunas eliminaciones en lugar de muchas otras. Pero en mi caso, la situación no merecía tal optimización.
No es un gran plan. El hecho de que el lenguaje lo tolera en cualquier ejecución determinada no lo convierte en una buena idea. –
Debe haberme pillado de mal humor, pero me parece que la respuesta a esta pregunta viene directamente de la documentación de foreach. – CurtainDog
http://stackoverflow.com/questions/223918/equivalent-equivalent-for-removing-elements-while-iterating-the-collection – Jeevi