← Назад к вопросам

Что такое Iterable?

1.0 Junior🔥 142 комментариев
#Dart

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Iterable?

Iterable — это интерфейс в Dart, который определяет набор методов для работы с коллекциями элементов, которые можно обойти последовательно. Это фундаментальная концепция функционального программирования в Dart и Flutter.

Базовое определение

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

// Iterable как интерфейс
abstract class Iterable<E> {
  Iterator<E> get iterator;  // главный метод
}

Ключевые характеристики

1. Ленивые вычисления (Lazy evaluation)

final numbers = Iterable.generate(1000000, (i) => i);
final evens = numbers.where((n) => n.isEven);

// Вычисления происходят ТОЛЬКО при итерации
for (final even in evens.take(5)) {
  print(even);  // 0, 2, 4, 6, 8
}

Преимущество: не вычисляем 1 миллион значений, только первые 5.

2. Единовременная итерация

final iterable = [1, 2, 3].map((n) => n * 2);

// Первая итерация работает
for (final v in iterable) print(v);  // 2, 4, 6

// Вторая итерация создаёт новый Iterator
for (final v in iterable) print(v);  // 2, 4, 6 (работает)

Отличия от List

ХарактеристикаIterableList
Хранение в памятиНе хранит элементыХранит все элементы
Доступ по индексуНетДа (list[0])
Размер заранее известенНетДа (.length)
ПроизводительностьЛучше для больших наборовБыстрее для маленьких
ИзменяемостьОбычно нетДа

Основные методы Iterable

final numbers = [1, 2, 3, 4, 5];

// map - трансформация элементов
final doubled = numbers.map((n) => n * 2);  // [2, 4, 6, 8, 10]

// where - фильтрация
final evens = numbers.where((n) => n.isEven);  // [2, 4]

// reduce - свёртка
final sum = numbers.reduce((a, b) => a + b);  // 15

// fold - свёртка с начальным значением
final sumWith100 = numbers.fold(100, (a, b) => a + b);  // 115

// expand - развёртывание
final expanded = numbers.expand((n) => [n, n]);  // [1, 1, 2, 2, 3, 3, ...]

// take - первые N элементов
final first3 = numbers.take(3);  // [1, 2, 3]

// skip - пропустить N элементов
final skip2 = numbers.skip(2);  // [3, 4, 5]

// any - есть ли хотя бы один элемент, удовлетворяющий условию
final hasEven = numbers.any((n) => n.isEven);  // true

// every - все ли элементы удовлетворяют условию
final allPositive = numbers.every((n) => n > 0);  // true

// toList - преобразование в List
final list = numbers.toList();

// toSet - преобразование в Set
final set = numbers.toSet();

Практический пример

// Обработка болього потока данных
Stream<int> fetchUserIds() async* {
  for (int i = 0; i < 1000000; i++) {
    yield i;
  }
}

// Эффективная обработка
final result = fetchUserIds()
  .where((id) => id % 2 == 0)        // фильтруем чётные
  .map((id) => fetchUser(id))        // загружаем пользователей
  .take(10)                           // берём первых 10
  .toList();                          // только теперь загружаем в память

Когда использовать

  • Iterable — для обработки больших наборов данных, где не нужен случайный доступ
  • List — когда нужен доступ по индексу или частые модификации
  • Stream — для асинхронных потоков данных

Вывод: Iterable — это мощный и эффективный способ работать с коллекциями в Dart, особенно когда нужна ленивая обработка больших объёмов данных.