Как и где использовать итераторы

Как использовать итераторы

Итератор ячеек

Существует несколько способов получения итератора ячеек, и можно использовать любой из этих методов в зависимости от требований приложения. Ниже приведены методы, возвращающие итераторы ячеек.

  1. Cells.iterator
  2. Row.iterator
  3. Range.iterator

Все упомянутые выше методы возвращают итератор, который позволяет обойти коллекцию ячеек, которая была инициализирована.

Приведенный ниже пример кода демонстрирует реализацию класса Iterator для коллекции ячеек.

Итератор строк

Итератор строк может быть получен при использовании метода RowCollection.iterator. Приведенный ниже пример кода демонстрирует реализацию итератора для класса RowCollection.

Итератор столбцов

Итератор столбцов доступен при использовании метода ColumnCollection.iterator. Приведенный ниже пример кода демонстрирует реализацию итератора для класса ColumnCollection.

Где использовать итераторы

Чтобы обсудить преимущества использования итераторов, давайте рассмотрим реальный пример.

Сценарий

Требуется пройти по всем ячейкам в данной таблице, чтобы прочитать их значения. Существует несколько способов реализации этой цели. Некоторые из них показаны ниже.

Использование диапазона отображения
Использование MaxDataRow и MaxDataColumn

Как можно заметить, что оба вышеупомянутых подхода используют более или менее аналогичную логику, то есть проходят по всем ячейкам в коллекции для чтения значений ячеек. Это может быть проблематичным по ряду причин, как обсуждается далее.

  1. API, такие как MaxRow, MaxDataRow, MaxColumn, MaxDataColumn и MaxDisplayRange, требуют дополнительного времени для сбора соответствующей статистики. Если матрица данных (строки x столбцы) большая, использование этих API может повлечь штраф производительности.
  2. В большинстве случаев не все ячейки в заданном диапазоне созданы. В таких ситуациях проверка каждой ячейки в матрице не так эффективна, как проверка только инициализированных ячеек.
  3. Обращение к ячейке в цикле как Cells.get(rowIndex, columnIndex) приведет к созданию всех объектов ячеек в диапазоне, что в конечном итоге может вызвать ошибку OutOfMemoryError.
Заключение

На основе вышеприведенных фактов перечислены возможные сценарии, в которых следует использовать итераторы.

  1. Требуется только чтение коллекции ячеек, то есть требуется только проверка ячеек.
  2. Необходимо пройти большое количество ячеек.
  3. Необходимо обойти только инициализированные ячейки/строки/столбцы.