Menu
Coddy logo textTech

Uso de '.toList()'

Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 12 de 65.

Cuando usas métodos como map() y where() en una lista, no devuelven una nueva List; devuelven un Iterable. Aunque un Iterable contiene los datos transformados o filtrados que deseas, a menudo necesitas convertirlo de nuevo en una List para usar los métodos y propiedades de lista familiares.

El método .toList() convierte un Iterable nuevamente en una List. Esta conversión crea una nueva lista que contiene todos los elementos del iterable, brindándote acceso a todas las operaciones de lista estándar a las que estás acostumbrado.

List<String> words = ['apple', 'banana', 'cherry', 'date'];

// where() devuelve un Iterable, no una List
var longWordsIterable = words.where((word) => word.length > 5);

// Convierte el Iterable en una List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Este paso de conversión es esencial cuando necesitas realizar operaciones de lista adicionales en tus datos filtrados o transformados. Sin .toList(), estarías trabajando con un Iterable, que tiene una funcionalidad más limitada que una List completa.

challenge icon

Desafío

Fácil

Crea un programa que gestione un sistema de recomendación de libros de una biblioteca filtrando libros según las preferencias de género y convirtiendo los resultados en un formato de lista adecuado. Tu programa debe:

  1. Leer una entrada de cadena que represente el nombre de la biblioteca (library name)
  2. Leer múltiples entradas de cadena que representen títulos de libros (la entrada terminará cuando recibas una cadena vacía)
  3. Leer múltiples entradas de cadena que representen los géneros de los libros correspondientes a cada título (la entrada terminará cuando recibas una cadena vacía)
  4. Leer una entrada de cadena que represente el género preferido para filtrar
  5. Usar el método where() para filtrar los libros que coincidan con el género preferido
  6. Usar el método toList() para convertir el iterable filtrado en una lista adecuada
  7. Imprimir los resultados de la recomendación en el formato exacto que se muestra a continuación

Por ejemplo, si el nombre de la biblioteca es "City Library", los libros son "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", los géneros son "Fiction", "Science Fiction", "Romance", "Fiction", y el género preferido es "Fiction", tu programa debería mostrar:

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

Si el nombre de la biblioteca es "School Library", los libros son "Harry Potter", "Lord of the Rings", los géneros son "Fantasy", "Fantasy", y el género preferido es "Mystery", tu programa debería mostrar:

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

Si el nombre de la biblioteca es "Community Library", los libros son "To Kill a Mockingbird", los géneros son "Classic", y el género preferido es "Classic", tu programa debería mostrar:

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

Tu programa debe usar el método where() para filtrar los libros comparando su género con el género preferido, luego usar el método toList() para convertir el iterable resultante en una lista. El iterable filtrado debe mostrarse en formato de paréntesis, mientras que la lista final debe mostrarse en formato de corchetes.

Hoja de referencia

Los métodos como map() y where() devuelven un Iterable, no una List. Usa .toList() para convertir un Iterable de nuevo en una List:

List<String> words = ['apple', 'banana', 'cherry', 'date'];

// where() devuelve un Iterable, no una List
var longWordsIterable = words.where((word) => word.length > 5);

// Convierte el Iterable en una List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Esta conversión es esencial cuando necesitas realizar operaciones de lista adicionales en datos filtrados o transformados.

Pruébalo tú mismo

import 'dart:io';

void main() {
  // Leer el nombre de la biblioteca
  String? libraryName = stdin.readLineSync();
  
  // Leer títulos de libros hasta encontrar una cadena vacía
  List<String> books = [];
  while (true) {
    String? book = stdin.readLineSync();
    if (book == null || book.isEmpty) break;
    books.add(book);
  }
  
  // Leer géneros de libros hasta encontrar una cadena vacía
  List<String> genres = [];
  while (true) {
    String? genre = stdin.readLineSync();
    if (genre == null || genre.isEmpty) break;
    genres.add(genre);
  }
  
  // Leer el género preferido
  String? preferredGenre = stdin.readLineSync();
  
  // TODO: Escribe tu código abajo
  // Usa el método where() para filtrar libros por el género preferido
  // Usa el método toList() para convertir el iterable filtrado en una lista
  
  // Imprimir los resultados en el formato requerido
  print('Library: $libraryName');
  print('All books: $books');
  print('All genres: $genres');
  print('Filtering by genre: $preferredGenre');
  // Imprimir libros filtrados (iterable) y libros recomendados (lista)
  // Imprimir el total de recomendaciones y el estado
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo