Hàm ẩn danh
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 44 trên 65.
Đến nay, bạn đã tạo các hàm với tên như calculateTotal hoặc printMessage. Nhưng đôi khi bạn chỉ cần một hàm đơn giản cho một nhiệm vụ cụ thể, và việc đặt tên cho hàm đó có vẻ không cần thiết. Đây là lúc hàm ẩn danh (anonymous function) phát huy tác dụng.
Hàm ẩn danh (anonymous function) là hàm không có tên. Bạn định nghĩa hàm ngay tại nơi cần dùng, giúp đoạn code ngắn gọn hơn khi thực hiện các thao tác ngắn và chỉ dùng một lần. Cú pháp rất đơn giản: bạn chỉ cần viết danh sách tham số, sau đó là phần thân hàm:
(parameter) {
// thân hàm
}Các hàm ẩn danh đặc biệt hữu ích khi dùng với các phương thức của danh sách. Ví dụ, thay vì tạo một hàm có tên riêng để in ra từng phần tử trong danh sách, bạn có thể dùng trực tiếp một hàm ẩn danh với phương thức forEach:
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {
print(fruit);
});Cách làm này giúp code của bạn gọn gàng và tập trung, đặc biệt khi logic của hàm (function) đơn giản và sẽ không được dùng lại ở nơi khác trong chương trình.
Thử thách
DễTạo một chương trình xử lý danh sách tên nhân viên bằng các hàm ẩn danh. Chương trình sẽ minh họa cách dùng phương thức forEach với hàm ẩn danh để thực hiện các thao tác khác nhau trên từng phần tử trong danh sách.
- Đọc chuỗi đầu vào chứa tên nhân viên, các tên được phân tách bằng dấu phẩy (ví dụ:
"Alice,Bob,Charlie,Diana") - Tách chuỗi đầu vào thành danh sách các tên riêng lẻ bằng phương thức
split() - Dùng phương thức
forEachvới một hàm ẩn danh để in ra tên từng nhân viên cùng lời chào mừng - Dùng phương thức
forEachvới một hàm ẩn danh khác để in ra tên từng nhân viên bằng chữ in hoa - Dùng phương thức
forEachvới hàm ẩn danh thứ ba để in ra tên từng nhân viên cùng số lượng ký tự trong tên
Ví dụ, nếu đầu vào là "Alice,Bob,Charlie", chương trình của bạn sẽ cho kết quả:
Processing employee list: Alice,Bob,Charlie
===========================================
Welcome Messages:
Welcome to the team, Alice!
Welcome to the team, Bob!
Welcome to the team, Charlie!
===========================================
Names in Uppercase:
ALICE
BOB
CHARLIE
===========================================
Name Lengths:
Alice has 5 characters
Bob has 3 characters
Charlie has 7 charactersNếu đầu vào là "John,Sarah", chương trình của bạn sẽ cho kết quả:
Processing employee list: John,Sarah
===========================================
Welcome Messages:
Welcome to the team, John!
Welcome to the team, Sarah!
===========================================
Names in Uppercase:
JOHN
SARAH
===========================================
Name Lengths:
John has 4 characters
Sarah has 5 charactersChương trình phải dùng ba lời gọi phương thức forEach riêng biệt, mỗi lời gọi có một hàm ẩn danh riêng. Hãy định nghĩa các hàm ẩn danh ngay tại chỗ, không đặt tên cho chúng. Mỗi hàm ẩn danh cần nhận một tham số đại diện cho tên nhân viên hiện tại và thực hiện thao tác được yêu cầu. Dùng nội suy chuỗi để định dạng các thông báo đầu ra chính xác như trên.
Tự làm thử
import 'dart:io';
void main() {
// Đọc chuỗi (string) đầu vào chứa tên nhân viên
String? input = stdin.readLineSync();
// Tách đầu vào thành danh sách (list) tên
List<String> employeeNames = input!.split(',');
// In ra thông báo bắt đầu xử lý
print('Processing employee list: $input');
print('===========================================');
// TODO: Viết code của bạn bên dưới
// Dùng forEach với các hàm (function) ẩn danh để:
// 1. In ra lời chào
// 2. In ra tên bằng chữ in hoa
// 3. In ra độ dài của tên
}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