Menu
Coddy logo textTech

Usando '.toList()'

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 12 de 65.

Quando você usa métodos como map() e where() em uma lista, eles não retornam uma nova List - eles retornam um Iterable. Embora um Iterable contenha os dados transformados ou filtrados que você deseja, muitas vezes você precisa convertê-lo de volta em uma List para usar métodos e propriedades de lista familiares.

O método .toList() converte um Iterable de volta para um List. Esta conversão cria uma nova lista contendo todos os elementos do iterável, dando a você acesso a todas as operações de lista padrão com as quais você está acostumado.

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

// where() retorna um Iterable, não uma List
var longWordsIterable = words.where((word) => word.length > 5);

// Converte o Iterable para uma List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Esta etapa de conversão é essencial quando você precisa realizar operações de lista adicionais em seus dados filtrados ou transformados. Sem o .toList(), você estaria trabalhando com um Iterable, que possui funcionalidades mais limitadas do que uma List completa.

challenge icon

Desafio

Fácil

Crie um programa que gerencie um sistema de recomendação de livros de uma biblioteca, filtrando os livros com base nas preferências de gênero e convertendo os resultados em um formato de lista adequado. Seu programa deve:

  1. Ler uma entrada de string representando o nome da biblioteca
  2. Ler múltiplas entradas de string representando os títulos dos livros (a entrada terminará quando você receber uma string vazia)
  3. Ler múltiplas entradas de string representando os gêneros dos livros correspondentes a cada título (a entrada terminará quando você receber uma string vazia)
  4. Ler uma entrada de string representando o gênero preferido para filtrar
  5. Usar o método where() para filtrar os livros que correspondem ao gênero preferido
  6. Usar o método toList() para converter o iterável filtrado em uma lista adequada
  7. Imprimir os resultados da recomendação no formato exato mostrado abaixo

Por exemplo, se o nome da biblioteca for "City Library", os livros forem "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", os gêneros forem "Fiction", "Science Fiction", "Romance", "Fiction", e o gênero preferido for "Fiction", seu programa deve exibir:

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

Se o nome da biblioteca for "School Library", os livros forem "Harry Potter", "Lord of the Rings", os gêneros forem "Fantasy", "Fantasy", e o gênero preferido for "Mystery", seu programa deve exibir:

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

Se o nome da biblioteca for "Community Library", os livros forem "To Kill a Mockingbird", o gênero for "Classic", e o gênero preferido for "Classic", seu programa deve exibir:

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

Seu programa deve usar o método where() para filtrar os livros, comparando seu gênero com o gênero preferido, e então usar o método toList() para converter o iterável resultante em uma lista. O iterável filtrado deve ser exibido no formato de parênteses, enquanto a lista final deve ser exibida no formato de colchetes.

Folha de consulta

Métodos como map() e where() retornam um Iterable, não uma List. Use .toList() para converter um Iterable de volta para uma List:

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

// where() retorna um Iterable, não uma List
var longWordsIterable = words.where((word) => word.length > 5);

// Converte o Iterable para uma List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Essa conversão é essencial quando você precisa realizar operações de lista adicionais em dados filtrados ou transformados.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome da biblioteca
  String? libraryName = stdin.readLineSync();
  
  // Ler títulos de livros até encontrar uma string vazia
  List<String> books = [];
  while (true) {
    String? book = stdin.readLineSync();
    if (book == null || book.isEmpty) break;
    books.add(book);
  }
  
  // Ler gêneros de livros até encontrar uma string vazia
  List<String> genres = [];
  while (true) {
    String? genre = stdin.readLineSync();
    if (genre == null || genre.isEmpty) break;
    genres.add(genre);
  }
  
  // Ler o gênero preferido
  String? preferredGenre = stdin.readLineSync();
  
  // TODO: Escreva seu código abaixo
  // Use o método where() para filtrar os livros pelo gênero preferido
  // Use o método toList() para converter o iterável filtrado em uma lista
  
  // Imprimir os resultados no formato exigido
  print('Library: $libraryName');
  print('All books: $books');
  print('All genres: $genres');
  print('Filtering by genre: $preferredGenre');
  // Imprimir livros filtrados (iterável) e livros recomendados (lista)
  // Imprimir o total de recomendações e o status
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo