J'aime beaucoup la construction pour chaque boucle ( Je me demande si s'il y a une manière que je puisse accéder à l'itérateur sous-jacent d'une telle boucle. Cela peut être obligatoire si je veux utiliser le pour (t e: ibler) code>) dans Java qui fonctionne sur n'importe quel
ibler
Supprimer () code> de l'itérateur. P>
6 Réponses :
Non, tout le point de la boucle pour chacune est de résumer l'itérateur sous-jacent. P>
Si vous en avez besoin, vous devez le déclarer. P>
Et lorsque vous le déclarez, il devrait s'agir d'un écouteur si vous envisagez de supprimer des éléments de la liste.
Utilisez A pour boucle à la place. P>
Non, vous ne pouvez pas supprimer les objets dans A pour chaque boucle.
Utilisez cela à la place: P>
Iterator<Type> it = collection.iterator(); while (it.hasNext()) { if (it.next().shouldBeRemoved()) { it.remove(); } }
Je préfère le pour code> idiom plutôt que le
pendant code> idiome car il conserve la portée de l'itérateur plus petit.
@Dty: Il existe un point valide dans votre désir de garder la portée de toutes les variables aussi étroite que possible. Mais quant à moi, la lisibilité du code est sur la première place. Ma version pourrait être lue presque comme une phrase normale: «Bien que Itérateur dispose d'un élément suivant, procédez comme suit: ...» et le vôtre semble très encombrant. Donc, si nous voulons garder des avantages des deux approches, il vaut la peine d'extraire le code du minime à une méthode distincte. C'est le meilleur que nous puissions faire avec ce problème, IMHO.
Modification des données a une sensation
Vous n'avez jamais entendu parler de la programmation fonctionnelle
Si la collection est raisonnablement petite, vous pouvez également utiliser une copie de la collection à itérer si vous souhaitez pouvoir supprimer des éléments afin que vous n'ayez pas à agir comme si vous avez deux collections.
CollectionUtils.filter(collection, new Predicate(){ boolean evaluate(Object object){return true;} });
Vous êtes correct, l'utilisation d'un itérateur prend en charge la possibilité de supprimer un objet d'une collection source en toute sécurité, en appelant Supprimer () sur l'itérateur lui-même. Le point ici est d'éviter une exception concurrenteModifiedException qui implique qu'une collection a été modifiée lorsqu'un itérateur était ouvert contre elle. Certaines collections vous permettront de vous échapper avec la suppression ou l'ajout d'éléments à une collection tout en itération, mais appelant Supprimer () sur l'itérateur est une pratique plus sûre. P>
Mais itérateur prend en charge un cousiterraator Dérivé et plus puissant Lisiterator (fort> disponible que dans les listes, prend en charge l'ajout et la suppression d'une liste lors de l'itération, ainsi que du défilement bidirectionnel via des listes. P>