Menu
CoddyTech

使用 '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 参数。这个参数接受一个函数,当找不到匹配项时会返回默认值,从而避免程序因错误而崩溃。

challenge icon

挑战

简单

创建一个程序,通过找出第一个需要立即处理的客户投诉来管理客户服务系统。你的程序应当:

  1. 读取一个表示部门名称的字符串输入
  2. 读取多个表示投诉优先级的整数输入(收到 -1 时结束输入)
  3. 读取一个表示紧急优先级阈值的整数输入
  4. 使用 firstWhere() 方法,找出第一个优先级大于或等于紧急阈值的投诉
  5. 按照下方所示的确切格式输出客户服务结果

例如,如果部门名称是 "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');
  // 打印第一个紧急投诉的结果
  // 打印状态信息
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器