Java Language Suppression d'éléments à l'aide d'un itérateur


Exemple

La méthode Iterator.remove() est une méthode facultative qui supprime l'élément renvoyé par l'appel précédent à Iterator.next() . Par exemple, le code suivant remplit une liste de chaînes puis supprime toutes les chaînes vides.

List<String> names = new ArrayList<>();
names.add("name 1");
names.add("name 2");
names.add("");
names.add("name 3");
names.add("");
System.out.println("Old Size : " + names.size());
Iterator<String> it = names.iterator();
while (it.hasNext()) {
  String el = it.next();
  if (el.equals("")) {
    it.remove();
  }
}
System.out.println("New Size : " + names.size());

Sortie:

Old Size : 5
New Size : 3

Notez que le code ci-dessus est un moyen sûr de supprimer des éléments lors de l'itération d'une collection type. Si, au contraire, vous tentez de supprimer des éléments d'une collection comme ceci:

for (String el: names) {
    if (el.equals("")) {
        names.remove(el); // WRONG!
    }
}

une collection typique (telle que ArrayList ) qui fournit aux itérateurs une sémantique d'itérateur rapide échoue pour lancer une ConcurrentModificationException .

La méthode remove() ne peut être appelée qu'une seule fois après un appel next() . S'il est appelé avant d'appeler next() ou s'il est appelé deux fois après un appel next() appel remove() lancera une IllegalStateException .

L'opération de remove est décrite comme une opération facultative ; Autrement dit, tous les itérateurs ne le permettront pas. Les exemples où il n'est pas pris en charge incluent les itérateurs pour les collections immuables, les vues en lecture seule des collections ou les collections de taille fixe. Si remove() est appelée lorsque l'itérateur ne prend pas en charge la suppression, une UnsupportedOperationException sera lancée.