Menu
CoddyTech

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.

challenge icon

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:

  1. Đọc một đầu vào chuỗi đại diện cho tên cửa hàng
  2. Đọ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)
  3. Đọ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á)
  4. 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
  5. 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 completed

Nế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 completed

Nế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 completed

Chươ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
}
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