Menu
Coddy logo textTech

Encontrando com 'firstWhere'

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 15 de 65.

Quando você precisa encontrar um elemento específico em uma lista que atenda a certos critérios, o método firstWhere() fornece uma solução eficiente. Ao contrário de métodos de filtragem que retornam todos os elementos correspondentes, o firstWhere() interrompe a busca assim que encontra o primeiro elemento que satisfaz sua condição.

O método firstWhere() recebe uma função de teste que retorna true ou false para cada elemento. Ele examina os elementos um por um até encontrar o primeiro que passe no teste e, em seguida, retorna imediatamente esse elemento.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// Encontre o primeiro número par
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

Para situações em que nenhum elemento corresponde à sua condição, o firstWhere() fornece um parâmetro orElse opcional. Este parâmetro aceita uma função que retorna um valor padrão quando nenhuma correspondência é encontrada, evitando que seu programa falhe com um erro.

challenge icon

Desafio

Fácil

Crie um programa que gerencie um sistema de atendimento ao cliente, encontrando a primeira reclamação de cliente que requer atenção imediata. Seu programa deve:

  1. Ler uma entrada de string representando o nome do departamento
  2. Ler múltiplas entradas de inteiros representando os níveis de prioridade das reclamações (a entrada terminará quando você receber -1)
  3. Ler uma entrada de inteiro representando o limite de prioridade urgente
  4. Usar o método firstWhere() para encontrar a primeira reclamação com um nível de prioridade maior ou igual ao limite urgente
  5. Imprimir os resultados do atendimento ao cliente no formato exato mostrado abaixo

Por exemplo, se o nome do departamento for "Technical Support", os níveis de prioridade forem 3, 7, 2, 9, 4, e o limite urgente for 8, seu programa deve exibir:

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

Se o nome do departamento for "Billing Department", os níveis de prioridade forem 4, 6, 3, 5, e o limite urgente for 7, seu programa deve exibir:

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

Se o nome do departamento for "Sales Support", os níveis de prioridade forem 10, 2, 8, e o limite urgente for 9, seu programa deve exibir:

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

Seu programa deve usar o método firstWhere() para encontrar a primeira prioridade de reclamação que seja maior ou igual ao limite urgente. Se nenhuma reclamação urgente for encontrada, exiba "Not found" para a primeira reclamação urgente e mostre "No urgent complaints - continue normal processing" como o status. Se uma reclamação urgente for encontrada, exiba o nível de prioridade e mostre "Urgent complaint found - immediate action required" como o status.

Folha de consulta

O método firstWhere() encontra o primeiro elemento em uma lista que satisfaz uma condição específica. Ele interrompe a busca assim que encontra uma correspondência e retorna esse elemento.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// Encontra o primeiro número par
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

Use o parâmetro orElse para fornecer um valor padrão quando nenhum elemento corresponder à condição:

// Retorna um valor padrão se nenhuma correspondência for encontrada
int result = numbers.firstWhere(
  (number) => number > 100,
  orElse: () => -1
);

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome do departamento
  String? department = stdin.readLineSync();
  
  // Ler os níveis de prioridade das reclamações até -1
  List<int> complaints = [];
  while (true) {
    int priority = int.parse(stdin.readLineSync()!);
    if (priority == -1) break;
    complaints.add(priority);
  }
  
  // Ler o limite de urgência
  int urgentThreshold = int.parse(stdin.readLineSync()!);
  
  // TODO: Escreva seu código abaixo
  // Use o método firstWhere() para encontrar a primeira reclamação >= urgentThreshold
  
  // Saída dos resultados
  print('Department: $department');
  print('All complaints: $complaints');
  print('Urgent threshold: $urgentThreshold');
  print('Searching for first complaint >= $urgentThreshold');
  // Imprimir o resultado da primeira reclamação urgente
  // Imprimir mensagem de status
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo