Menu
Coddy logo textTech

Использование '.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.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой рекомендаций библиотечных книг, фильтруя книги на основе жанровых предпочтений и преобразуя результаты в соответствующий формат списка. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название библиотеки
  2. Прочитать несколько строковых вводов, представляющих названия книг (ввод закончится, когда вы получите пустую строку)
  3. Прочитать несколько строковых вводов, представляющих жанры книг, соответствующие каждому названию (ввод закончится, когда вы получите пустую строку)
  4. Прочитать строковый ввод, представляющий предпочтительный жанр для фильтрации
  5. Использовать метод where() для фильтрации книг, соответствующих предпочтительному жанру
  6. Использовать метод toList() для преобразования отфильтрованного итерируемого объекта в полноценный список
  7. Вывести результаты рекомендаций в точном формате, показанном ниже

Например, если название библиотеки — "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)
  // Вывести общее количество рекомендаций и статус
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком