Что такое Iterable в Dart?

«Что такое Iterable в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Iterable в Dart — это интерфейс (абстрактный класс), представляющий последовательность элементов, которую можно перебирать (итерировать). Это основа для работы с коллекциями. Важное отличие от ListIterable может быть "ленивым" (lazy), то есть элементы вычисляются только в момент обращения к ним.

Основные характеристики и использование:

void main() {
  // List реализует интерфейс Iterable
  Iterable<int> numbers = [1, 2, 3, 4, 5];

  // Цепочка преобразований. Вычисления происходят лениво.
  var processed = numbers
      .where((n) => n.isOdd)          // Фильтруем нечетные: (1, 3, 5)
      .map((n) => n * n)              // Возводим в квадрат: (1, 9, 25)
      .take(2);                       // Берем первые два: (1, 9)

  // Итерация происходит здесь, в for-in
  for (var value in processed) {
    print(value); // Выведет 1, затем 9
  }

  // Чтобы получить материализованный список, вызываем .toList()
  List<int> resultList = processed.toList(); // [1, 9]
}

Ключевые методы Iterable:

  • where((element) => condition): Фильтрует элементы.
  • map<T>((element) => newValue): Преобразует каждый элемент.
  • forEach((element) { ... }): Выполняет действие для каждого элемента.
  • toList(), toSet(): Преобразует в конкретную коллекцию.
  • first, last, single: Получают элементы (с проверками).
  • any((element) => condition), every((element) => condition): Проверяют условия.

Зачем это нужно в Flutter?

  • Эффективность: Ленивые вычисления экономят память и процессорное время, особенно при работе с большими наборами данных (например, списком сообщений или товаров).
  • Выразительность: Цепочки методов map, where позволяют писать чистый и декларативный код для обработки данных перед отображением в ListView.builder.
  • Абстракция: Вы можете написать функцию, принимающую Iterable, и она будет работать с любым типом коллекции (List, Set, результатом map).