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); // 8Para 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.
Desafio
FácilCrie 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:
- Ler uma entrada de string representando o nome do departamento
- Ler múltiplas entradas de inteiros representando os níveis de prioridade das reclamações (a entrada terminará quando você receber
-1) - Ler uma entrada de inteiro representando o limite de prioridade urgente
- Usar o método
firstWhere()para encontrar a primeira reclamação com um nível de prioridade maior ou igual ao limite urgente - 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 requiredSe 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 processingSe 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 requiredSeu 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); // 8Use 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
}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
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos