Biến đổi bằng 'map'
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 10 trên 65.
Khi cần biến đổi mọi phần tử trong danh sách thành một giá trị mới, Dart cung cấp phương thức map() mạnh mẽ. Phương thức này áp dụng một hàm biến đổi cho từng phần tử trong danh sách và tạo ra một Iterable mới, có tính lười, chứa các kết quả đã biến đổi (gọi .toList() để nhận danh sách).
Phương thức map() nhận một hàm (function) làm tham số để xác định cách biến đổi từng phần tử. Hàm này nhận từng phần tử từ danh sách ban đầu và trả về phiên bản đã biến đổi. Sau đó, phương thức map() tập hợp tất cả các giá trị đã biến đổi này vào một danh sách mới.
List<int> numbers = [1, 2, 3, 4, 5];
// Biến đổi từng số bằng cách nhân đôi số đó
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)Cách tiếp cận này thanh lịch hơn nhiều so với việc tự tạo danh sách mới rồi dùng vòng lặp để biến đổi từng phần tử. Phương thức (method) map() thể hiện một khái niệm nền tảng trong lập trình hàm (functional programming), giúp bạn diễn đạt các phép biến đổi dữ liệu một cách rõ ràng và súc tích.
Thử thách
DễTạo một chương trình quản lý hệ thống định giá sản phẩm bằng cách điều chỉnh giá theo phần trăm cho tất cả mặt hàng trong kho của cửa hàng. Chương trình của bạn cần:
- Đọc một đầu vào chuỗi đại diện cho tên cửa hàng
- Đọc nhiều đầu vào số thập phân đại diện cho giá gốc của sản phẩm (đầu vào sẽ kết thúc khi bạn nhận được
-1) - Đọc một đầu vào số thập phân đại diện cho mức điều chỉnh theo phần trăm (số dương để tăng giá, số âm để giảm giá)
- Dùng phương thức
map()để biến đổi từng mức giá bằng cách áp dụng mức điều chỉnh theo phần trăm - In ra kết quả điều chỉnh giá theo đúng định dạng bên dưới
Ví dụ, nếu tên cửa hàng là "Tech Store", các mức giá là 99.99, 149.50, 79.99, 199.99 và mức điều chỉnh là 15.0 (tăng 15%), chương trình của bạn cần in ra:
Store: Tech Store
Original prices: [99.99, 149.5, 79.99, 199.99]
Applying 15.0% adjustment
Adjusted prices: (114.9885, 171.925, 91.9885, 229.9885)
Total items processed: 4
Status: Price adjustment completedNếu tên cửa hàng là "Fashion Outlet", các mức giá là 29.99, 45.00 và mức điều chỉnh là -20.0 (giảm 20%), chương trình của bạn cần in ra:
Store: Fashion Outlet
Original prices: [29.99, 45.0]
Applying -20.0% adjustment
Adjusted prices: (23.992, 36.0)
Total items processed: 2
Status: Price adjustment completedNếu tên cửa hàng là "Book Corner", chỉ có một mức giá 12.50 và mức điều chỉnh là 0.0, chương trình của bạn cần in ra:
Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completedChương trình của bạn phải dùng phương thức map() với một hàm biến đổi để tính giá mới theo công thức: originalPrice * (1 + percentage / 100). Phương thức map() cần trả về một iterable chứa tất cả mức giá đã điều chỉnh, được hiển thị theo định dạng có dấu ngoặc đơn.
Tự làm thử
import 'dart:io';
void main() {
// Đọc tên cửa hàng
String? storeName = stdin.readLineSync();
// Đọc các mức giá cho đến khi gặp -1
List<double> prices = [];
while (true) {
String? input = stdin.readLineSync();
double price = double.parse(input!);
if (price == -1) {
break;
}
prices.add(price);
}
// Đọc tỷ lệ phần trăm điều chỉnh
String? adjustmentInput = stdin.readLineSync();
double adjustment = double.parse(adjustmentInput!);
// TODO: Viết code bên dưới
// Dùng phương thức (method) map() để điều chỉnh tất cả mức giá theo tỷ lệ phần trăm
// Công thức: originalPrice * (1 + percentage / 100)
// In ra kết quả
print('Store: $storeName');
print('Original prices: $prices');
print('Applying $adjustment% adjustment');
// In các mức giá đã điều chỉnh trong dấu ngoặc đơn
// In tổng số mặt hàng đã xử lý
// In thông báo 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