使用 'map' 进行转换
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 10 课,共 65 课。
当你需要将列表中的每个元素都转换成新内容时,Dart 提供了强大的 map() 方法。这个方法会对列表中的每个元素应用一个转换函数,并生成一个包含转换结果的新惰性 Iterable(调用 .toList() 可获得列表)。
map() 方法接收一个函数作为参数,用来定义如何转换每个元素。这个函数接收原始列表中的每个元素,并返回转换后的版本。然后,map() 方法会将所有这些转换后的值收集到一个新列表中。
List<int> numbers = [1, 2, 3, 4, 5];
// 将每个数字翻倍
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)这种方法比手动创建新列表并使用循环转换每个元素优雅得多。map() 方法体现了函数式编程中的一个基本概念,让你能够以清晰简洁的方式表达数据转换。
挑战
简单创建一个程序,通过对商店库存中的所有商品应用百分比价格调整来管理商品定价系统。你的程序应当:
- 读取一个表示商店名称的字符串输入
- 读取多个表示商品原价的小数输入(输入在收到
-1时结束) - 读取一个表示百分比调整的小数输入(正数表示涨价,负数表示折扣)
- 使用
map()方法对每个价格应用百分比调整 - 按照下方显示的确切格式打印价格调整结果
例如,如果商店名称是 "Tech Store",价格分别为 99.99、149.50、79.99、199.99,调整幅度为 15.0(涨价 15%),你的程序应输出:
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如果商店名称是 "Fashion Outlet",价格分别为 29.99、45.00,调整幅度为 -20.0(打 8 折),你的程序应输出:
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如果商店名称是 "Book Corner",并且只提供一个价格 12.50,调整幅度为 0.0,你的程序应输出:
Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completed你的程序必须使用 map() 方法和一个转换函数,根据公式 originalPrice * (1 + percentage / 100) 计算新价格。map() 方法应返回一个包含所有调整后价格的可迭代对象,并以括号格式显示。
亲手试试
import 'dart:io';
void main() {
// 读取商店名称
String? storeName = stdin.readLineSync();
// 读取价格,直到遇到 -1
List<double> prices = [];
while (true) {
String? input = stdin.readLineSync();
double price = double.parse(input!);
if (price == -1) {
break;
}
prices.add(price);
}
// 读取调整百分比
String? adjustmentInput = stdin.readLineSync();
double adjustment = double.parse(adjustmentInput!);
// TODO:在下方编写你的代码
// 使用 map() 方法对所有价格应用百分比调整
// 公式:originalPrice * (1 + percentage / 100)
// 输出结果
print('Store: $storeName');
print('Original prices: $prices');
print('Applying $adjustment% adjustment');
// 用括号格式打印调整后的价格
// 打印已处理的商品总数
// 打印状态消息
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器