Как я могу использовать Java для каждого цикла с пользовательскими классами? - PullRequest
46 голосов
/ 10 июня 2009

Я думаю, что большинство кодеров использовали код, подобный следующему:


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

Как я могу использовать преимущества каждого цикла в моих собственных классах? Есть ли интерфейс, который я должен реализовать?

Ответы [ 3 ]

52 голосов
/ 10 июня 2009

Вы можете реализовать Итерируемый .

Вот пример . Это не лучший вариант, так как объект является собственным итератором. Однако это должно дать вам представление о том, что происходит.

11 голосов
/ 26 августа 2014

Короткая версия цикла for (T обозначает мой пользовательский тип):

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

переводится на:

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

и итератор для моей коллекции может выглядеть так:

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");

        }
   }
}
7 голосов
/ 10 июня 2009

Вы должны реализовать интерфейс Iterable , то есть вы должны реализовать метод

class MyClass implements Iterable<YourType>
{
Iterator<YourType> iterator()
  {
  return ...;//an iterator over your data
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...