web-dev-qa-db-fra.com

Comment puis-je utiliser le Java pour chaque boucle avec des classes personnalisées?

Je pense que la plupart des codeurs ont utilisé du code comme celui-ci:


ArrayList<String> myStringList = getStringList();
for(String str : myStringList)
{
   doSomethingWith(str);
}

Comment puis-je profiter de la pour chaque boucle avec mes propres classes? Y a-t-il une interface que je devrais implémenter?

46
Geo

Vous pouvez implémenter Iterable .

Voici un exemple . Ce n'est pas le meilleur, car l'objet est son propre itérateur. Cependant, cela devrait vous donner une idée de ce qui se passe.

52
Brian Agnew

La version courte de for loop (T représente mon type personnalisé):

for (T var : coll) {
    //body of the loop
}

se traduit par:

for (Iterator<T> iter = coll.iterator(); iter.hasNext(); ) {
    T var = iter.next();
    //body of the loop
}

et l'itérateur de ma collection pourrait ressembler à ceci:

class MyCollection<T> implements Iterable<T> {

    public int size() { /*... */ }

    public T get(int i) { /*... */ }

    public Iterator<T> iterator() {
        return new MyIterator();
    }

    class MyIterator implements Iterator<T> {

        private int index = 0;

        public boolean hasNext() {
            return index < size();
        }

        public type next() {
            return get(index++);
        }

        public void remove() {
            throw new UnsupportedOperationException("not supported yet");

        }
   }
}
11
Tombart

Vous devez implémenter Iterable interface , c'est-à-dire que vous devez implémenter la méthode

class MyClass implements Iterable<YourType>
{
Iterator<YourType> iterator()
  {
  return ...;//an iterator over your data
  }
}
7
Pierre