Комментарии (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
| Характеристика | Iterable | List |
|---|---|---|
| Хранение в памяти | Не хранит элементы | Хранит все элементы |
| Доступ по индексу | Нет | Да (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, особенно когда нужна ленивая обработка больших объёмов данных.