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 đủ.
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:
- Đọc một giá trị chuỗi (string) đầu vào đại diện cho tên thư viện
- Đọ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)
- Đọ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)
- Đọ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
- 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 - Dùng phương thức
toList()để chuyển iterable đã lọc thành một danh sách phù hợp - 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 readyNế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 readyNế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 readyChươ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
}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
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online