Класс Iterator
Класс Iterator представляет собой интерфейс
для последовательного перебора элементов коллекции.
Он лежит в основе работы циклов for-in и всех
итерируемых объектов Iterable. Итератор хранит
указатель на текущий элемент и умеет перемещаться
к следующему. Свойство current возвращает текущий
элемент, а метод moveNext сдвигает указатель
к следующему элементу и возвращает true, если
перемещение удалось, или false, если элементы
закончились.
Класс Iterator является абстрактным: напрямую
создать его экземпляр нельзя, но можно реализовать
собственный итератор или получить готовый через
свойство iterator любого объекта Iterable.
Синтаксис
abstract class Iterator<E>
{
E get current;
bool moveNext();
}
Пример
Давайте получим итератор списка и вручную переберём
все его элементы с помощью метода moveNext:
void main()
{
List<String> list = ['a', 'b', 'c', 'd', 'e'];
Iterator<String> it = list.iterator;
while (it.moveNext())
{
print(it.current);
}
}
Результат выполнения кода:
"a"
"b"
"c"
"d"
"e"
Пример
Давайте посмотрим, что возвращает метод moveNext,
когда элементы коллекции закончились:
void main()
{
List<int> list = [1, 2, 3];
Iterator<int> it = list.iterator;
print(it.moveNext());
print(it.current);
print(it.moveNext());
print(it.current);
print(it.moveNext());
print(it.current);
print(it.moveNext());
}
Результат выполнения кода:
true
1
true
2
true
3
false
Пример
Давайте реализуем собственный итератор, который перебирает элементы списка в обратном порядке:
class ReverseIterator<E> implements Iterator<E>
{
final List<E> _list;
int _index;
ReverseIterator(this._list) : _index = _list.length;
@override
E get current => _list[_index];
@override
bool moveNext()
{
if (_index > 0)
{
_index--;
return true;
}
return false;
}
}
void main()
{
ReverseIterator<String> it =
ReverseIterator(['a', 'b', 'c', 'd', 'e']);
while (it.moveNext())
{
print(it.current);
}
}
Результат выполнения кода:
"e"
"d"
"c"
"b"
"a"