Menu
CoddyTech

Dùng '.toList()'

Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 12 trên 65.

Khi dùng các phương thức như map() và where() trên danh sách, chúng không trả về một List mới, mà trả về một Iterable. Dù Iterable chứa dữ liệu đã chuyển đổi hoặc lọc mà bạn cần, bạn thường phải chuyển đổi nó lại thành List để dùng các phương thức và thuộc tính quen thuộc của danh sách.

Phương thức .toList() chuyển đổi một Iterable trở lại thành List. Việc chuyển đổi này tạo ra một danh sách mới chứa tất cả phần tử từ iterable, giúp bạn dùng các thao tác danh sách tiêu chuẩn quen thuộc.

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

// where() trả về một Iterable, không phải List
var longWordsIterable = words.where((word) => word.length > 5);

// Chuyển Iterable thành List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Bước chuyển đổi này rất cần thiết khi bạn cần thực hiện thêm các thao tác với danh sách trên dữ liệu đã lọc hoặc biến đổi. Nếu không có .toList(), bạn sẽ làm việc với một Iterable, vốn có ít chức năng hơn một List đầy đủ.

challenge icon

Thử thách

Dễ

Tạo một chương trình quản lý hệ thống đề xuất sách của thư viện bằng cách lọc sách theo thể loại yêu thích và chuyển kết quả sang định dạng danh sách phù hợp. Chương trình cần:

  1. Đọc một giá trị chuỗi (string) đầu vào đại diện cho tên thư viện
  2. Đọc nhiều giá trị chuỗi đầu vào đại diện cho tên sách (đầu vào kết thúc khi bạn nhận được một chuỗi rỗng)
  3. Đọc nhiều giá trị chuỗi đầu vào đại diện cho thể loại tương ứng với từng tên sách (đầu vào kết thúc khi bạn nhận được một chuỗi rỗng)
  4. Đọc một giá trị chuỗi đầu vào đại diện cho thể loại yêu thích dùng để lọc
  5. Dùng phương thức where() để lọc những sách có thể loại trùng với thể loại yêu thích
  6. Dùng phương thức toList() để chuyển iterable đã lọc thành một danh sách phù hợp
  7. In kết quả đề xuất theo đúng định dạng bên dưới

Ví dụ, nếu tên thư viện là "City Library", các sách là "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", các thể loại là "Fiction", "Science Fiction", "Romance", "Fiction", và thể loại yêu thích là "Fiction", chương trình cần in ra:

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

Nếu tên thư viện là "School Library", các sách là "Harry Potter", "Lord of the Rings", các thể loại là "Fantasy", "Fantasy", và thể loại yêu thích là "Mystery", chương trình cần in ra:

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

Nếu tên thư viện là "Community Library", sách là "To Kill a Mockingbird", thể loại là "Classic", và thể loại yêu thích là "Classic", chương trình cần in ra:

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

Chương trình phải dùng phương thức where() để lọc sách bằng cách so khớp thể loại của chúng với thể loại yêu thích, sau đó dùng phương thức toList() để chuyển iterable kết quả thành danh sách. Hãy hiển thị iterable đã lọc trong dấu ngoặc đơn, còn danh sách cuối cùng trong dấu ngoặc vuông.

Tự làm thử

import 'dart:io';

void main() {
  // Đọc tên thư viện
  String? libraryName = stdin.readLineSync();
  
  // Đọc tên sách cho đến khi gặp chuỗi rỗng
  List<String> books = [];
  while (true) {
    String? book = stdin.readLineSync();
    if (book == null || book.isEmpty) break;
    books.add(book);
  }
  
  // Đọc thể loại sách cho đến khi gặp chuỗi rỗng
  List<String> genres = [];
  while (true) {
    String? genre = stdin.readLineSync();
    if (genre == null || genre.isEmpty) break;
    genres.add(genre);
  }
  
  // Đọc thể loại ưa thích
  String? preferredGenre = stdin.readLineSync();
  
  // TODO: Viết code bên dưới
  // Dùng phương thức where() để lọc sách theo thể loại ưa thích
  // Dùng phương thức toList() để chuyển tập phần tử đã lọc thành danh sách
  
  // In kết quả theo định dạng yêu cầu
  print('Library: $libraryName');
  print('All books: $books');
  print('All genres: $genres');
  print('Filtering by genre: $preferredGenre');
  // In sách đã lọc (tập phần tử có thể duyệt) và sách được đề xuất (danh sách)
  // In tổng số đề xuất và trạng thái
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Dart online