使用 'firstWhere' 查找
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 15 课,共 65 课。
当你需要在列表中查找符合特定条件的元素时,firstWhere() 方法可以提供高效的解决方案。与返回所有匹配元素的筛选方法不同,firstWhere() 会在找到第一个满足条件的元素后立即停止搜索。
firstWhere() 方法会接收一个测试函数,该函数会针对每个元素返回 true 或 false。它会逐个检查元素,直到找到第一个通过测试的元素,然后立即返回该元素。
List<int> numbers = [1, 3, 8, 15, 22, 7];
// 找到第一个偶数
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8如果没有元素符合你的条件,firstWhere() 提供了一个可选的 orElse 参数。这个参数接受一个函数,当找不到匹配项时会返回默认值,从而避免程序因错误而崩溃。
挑战
简单创建一个程序,通过找出第一个需要立即处理的客户投诉来管理客户服务系统。你的程序应当:
- 读取一个表示部门名称的字符串输入
- 读取多个表示投诉优先级的整数输入(收到
-1时结束输入) - 读取一个表示紧急优先级阈值的整数输入
- 使用
firstWhere()方法,找出第一个优先级大于或等于紧急阈值的投诉 - 按照下方所示的确切格式输出客户服务结果
例如,如果部门名称是 "Technical Support",优先级依次为 3、7、2、9、4,紧急阈值为 8,你的程序应输出:
Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action required如果部门名称是 "Billing Department",优先级依次为 4、6、3、5,紧急阈值为 7,你的程序应输出:
Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processing如果部门名称是 "Sales Support",优先级依次为 10、2、8,紧急阈值为 9,你的程序应输出:
Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action required你的程序必须使用 firstWhere() 方法,找出第一个优先级大于或等于紧急阈值的投诉。如果没有找到紧急投诉,则将首个紧急投诉显示为 "Not found",并将 "No urgent complaints - continue normal processing" 显示为状态。如果找到了紧急投诉,则显示其优先级,并将 "Urgent complaint found - immediate action required" 显示为状态。
亲手试试
import 'dart:io';
void main() {
// 读取部门名称
String? department = stdin.readLineSync();
// 读取投诉优先级,直到遇到 -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// 读取紧急阈值
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO:在下方编写你的代码
// 使用 firstWhere() 方法查找第一个优先级 >= urgentThreshold 的投诉
// 输出结果
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// 打印第一个紧急投诉的结果
// 打印状态信息
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器