Использование '.toList()'
Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 12 из 65.
Когда вы используете такие методы, как map() и where() для списка, они не возвращают новый List — они возвращают Iterable. Хотя Iterable содержит нужные вам преобразованные или отфильтрованные данные, вам часто требуется преобразовать его обратно в List, чтобы использовать привычные методы и свойства списка.
Метод .toList() преобразует Iterable обратно в List. Это преобразование создает новый список, содержащий все элементы итерируемого объекта, предоставляя вам доступ ко всем стандартным операциям со списками, к которым вы привыкли.
List<String> words = ['apple', 'banana', 'cherry', 'date'];
// where() возвращает Iterable, а не List
var longWordsIterable = words.where((word) => word.length > 5);
// Преобразование Iterable в List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList); // ['banana', 'cherry']Этот шаг преобразования необходим, когда вам нужно выполнить дополнительные операции со списком над отфильтрованными или преобразованными данными. Без .toList() вы будете работать с Iterable, который имеет более ограниченную функциональность, чем полноценный List.
Задание
ЛегкоСоздайте программу, которая управляет системой рекомендаций библиотечных книг, фильтруя книги на основе жанровых предпочтений и преобразуя результаты в соответствующий формат списка. Ваша программа должна:
- Прочитать строковый ввод, представляющий название библиотеки
- Прочитать несколько строковых вводов, представляющих названия книг (ввод закончится, когда вы получите пустую строку)
- Прочитать несколько строковых вводов, представляющих жанры книг, соответствующие каждому названию (ввод закончится, когда вы получите пустую строку)
- Прочитать строковый ввод, представляющий предпочтительный жанр для фильтрации
- Использовать метод
where()для фильтрации книг, соответствующих предпочтительному жанру - Использовать метод
toList()для преобразования отфильтрованного итерируемого объекта в полноценный список - Вывести результаты рекомендаций в точном формате, показанном ниже
Например, если название библиотеки — "City Library", книги — "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", жанры — "Fiction", "Science Fiction", "Romance", "Fiction", а предпочтительный жанр — "Fiction", ваша программа должна вывести:
Library: City Library
All books: [The Great Gatsby, Dune, Pride and Prejudice, 1984]
All genres: [Fiction, Science Fiction, Romance, Fiction]
Filtering by genre: Fiction
Filtered books (iterable): (The Great Gatsby, 1984)
Recommended books (list): [The Great Gatsby, 1984]
Total recommendations: 2
Status: Recommendations readyЕсли название библиотеки — "School Library", книги — "Harry Potter", "Lord of the Rings", жанры — "Fantasy", "Fantasy", а предпочтительный жанр — "Mystery", ваша программа должна вывести:
Library: School Library
All books: [Harry Potter, Lord of the Rings]
All genres: [Fantasy, Fantasy]
Filtering by genre: Mystery
Filtered books (iterable): ()
Recommended books (list): []
Total recommendations: 0
Status: Recommendations readyЕсли название библиотеки — "Community Library", книги — "To Kill a Mockingbird", жанры — "Classic", а предпочтительный жанр — "Classic", ваша программа должна вывести:
Library: Community Library
All books: [To Kill a Mockingbird]
All genres: [Classic]
Filtering by genre: Classic
Filtered books (iterable): (To Kill a Mockingbird)
Recommended books (list): [To Kill a Mockingbird]
Total recommendations: 1
Status: Recommendations readyВаша программа должна использовать метод where() для фильтрации книг путем сопоставления их жанра с предпочтительным жанром, а затем использовать метод toList() для преобразования полученного итерируемого объекта в список. Отфильтрованный итерируемый объект должен отображаться в формате круглых скобок, а окончательный список — в формате квадратных скобок.
Шпаргалка
Методы, такие как map() и where(), возвращают Iterable, а не List. Используйте .toList(), чтобы преобразовать Iterable обратно в List:
List<String> words = ['apple', 'banana', 'cherry', 'date'];
// where() возвращает Iterable, а не List
var longWordsIterable = words.where((word) => word.length > 5);
// Преобразование Iterable в List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList); // ['banana', 'cherry']Это преобразование необходимо, когда вам нужно выполнить дополнительные операции со списком над отфильтрованными или преобразованными данными.
Попробуйте сами
import 'dart:io';
void main() {
// Прочитать название библиотеки
String? libraryName = stdin.readLineSync();
// Читать названия книг до пустой строки
List<String> books = [];
while (true) {
String? book = stdin.readLineSync();
if (book == null || book.isEmpty) break;
books.add(book);
}
// Читать жанры книг до пустой строки
List<String> genres = [];
while (true) {
String? genre = stdin.readLineSync();
if (genre == null || genre.isEmpty) break;
genres.add(genre);
}
// Прочитать предпочитаемый жанр
String? preferredGenre = stdin.readLineSync();
// TODO: Напишите свой код ниже
// Используйте метод where() для фильтрации книг по предпочитаемому жанру
// Используйте метод toList() для преобразования отфильтрованной итерируемой коллекции в список
// Вывести результаты в требуемом формате
print('Library: $libraryName');
print('All books: $books');
print('All genres: $genres');
print('Filtering by genre: $preferredGenre');
// Вывести отфильтрованные книги (iterable) и рекомендованные книги (list)
// Вывести общее количество рекомендаций и статус
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей