Метод getRange(start, end) используется для того, чтобы выделить определенную часть списка и работать с ней как с отдельной коллекцией.
Простыми словами: вы говорите списку «дай мне элементы с позиции A до позиции B».
Как это работает (основные правила):
start — индекс элемента, с которого начинаем (включительно).
end — индекс, на котором останавливаемся (не включая его).
Результат — он возвращает не новый список List, а Iterable (ленивую последовательность). Чтобы превратить её в обычный список, в конце часто добавляют .toList().
Наглядный пример:
Представьте, что у вас есть список из 5 элементов: ['А', 'Б', 'В', 'Г', 'Д'] Индексы: 0 1 2 3 4
Если вы вызовете getRange(1, 4), программа возьмет элементы с индексами 1, 2 и 3. Индекс 4 (буква 'Д') не войдет.
Пример в коде (Dart):
Dart
voidmain() {List<String> fruits = ['яблоко', 'банан', 'груша', 'слива', 'киви'];// Берем фрукты с 1-го по 3-й индекс (не включая 4-й)var range = fruits.getRange(1, 4); print(range); // Выведет: (банан, груша, слива)// Если нужен именно список:List<String> subList = range.toList();}
Зачем это нужно?
Для обработки кусками: Например, если у вас 1000 записей, а вы хотите отобразить только первые 10 (пагинация).
Для экономии памяти: getRange не копирует данные сразу, он просто дает «окно» в существующий список.
Для безопасности: Если вы хотите передать часть данных в другую функцию, но не хотите, чтобы она имела доступ ко всему списку.
Важные нюансы:
Если вы укажете start больше, чем end, или выйдете за границы списка — программа выдаст ошибку (RangeError).
Если исходный список изменится (например, вы удалите из него элементы), работа с getRange может привести к ошибкам, так как он ссылается на оригинал.
. indexWhere(test, [start])
Ищет первый элемент, который подходит под условие, двигаясь от начала к концу.
test: функция-условие (возвращает true или false).
start (необязательно): с какого индекса начинать поиск. По умолчанию — 0.
Результат: индекс первого найденного элемента. Если ничего не найдено, вернет -1.
Пример:
У вас список покупок, и вы хотите найти индекс первого товара, который стоит дороже 100 рублей.
Dart
2. lastIndexWhere(test, [start])
Ищет последний элемент, который подходит под условие, двигаясь от конца к началу (или от указанного start вниз до 0).
test: функция-условие.
start (необязательно): индекс, с которого начинать поиск «назад». По умолчанию — конец списка.
Результат: индекс последнего подходящего элемента. Если не найдено — -1.
Пример:
Dart
В чем главная фишка параметра [start]?
Он позволяет «проигнорировать» часть списка.
В indexWhere: если вы укажете indexWhere(condition, 2), поиск начнется только с третьего элемента (индекс 2) и пойдет вправо.
В lastIndexWhere: если вы укажете lastIndexWhere(condition, 2), поиск начнется с третьего элемента и пойдет влево к началу.
Коротко:
Метод
Откуда ищет
Что возвращает
indexWhere
Слева направо
Индекс первого совпадения
lastIndexWhere
Справа налево
Индекс последнего совпадения
Как это работает «на пальцах»:
Представьте, что у вас есть куча деталей конструктора, и вы соединяете их одну за другой, пока не получится одна цельная фигура.
Берется первый элемент списка (это начальный результат).
Берется второй элемент.
Они «склеиваются» вашей функцией combine.
Полученный результат «склеивается» с третьим элементом, и так до конца.
Пример 1: Сумма чисел
Dart
Пример 2: Самое длинное слово
Вы можете использовать reduce, чтобы найти какой-то экстремум (максимум, минимум, самую длинную строку):
Dart
Важные ограничения:
Тип данных не меняется: Если у вас список чисел int, то и результатом reduce может быть только int. Вы не можете превратить список строк в число через reduce (для этого есть метод fold).
Список не должен быть пустым: Если вызвать reduce на пустом списке, программа упадет с ошибкой.
Один элемент: Если в списке всего один элемент, reduce просто вернет его, даже не запуская вашу функцию.
List<Map<String, dynamic>> products = [
{'name': 'Хлеб', 'price': 50},
{'name': 'Молоко', 'price': 120}, // Индекс 1
{'name': 'Сыр', 'price': 300}, // Индекс 2
];
int index = products.indexWhere((item) => item['price'] > 100);
print(index); // Выведет: 1 (так как молоко — первый дорогой товар)
int lastIndex = products.lastIndexWhere((item) => item['price'] > 100);
print(lastIndex); // Выведет: 2 (так как сыр — последний дорогой товар в списке)
List<int> numbers = [1, 2, 3, 4];
// total — это накопленный результат, element — текущее число из списка
int sum = numbers.reduce((total, element) => total + element);
print(sum); // 10 (сначала 1+2=3, потом 3+3=6, потом 6+4=10)