Trouver avec 'firstWhere'
Fait partie de la section Logique & Flux du Journey Dart de Coddy — leçon 15 sur 65.
Lorsque vous avez besoin de trouver un élément spécifique dans une liste qui répond à certains critères, la méthode firstWhere() offre une solution efficace. Contrairement aux méthodes de filtrage qui retournent tous les éléments correspondants, firstWhere() arrête la recherche dès qu'elle trouve le premier élément qui satisfait votre condition.
La méthode firstWhere() prend une fonction de test qui renvoie true ou false pour chaque élément. Elle examine les éléments un par un jusqu'à ce qu'elle trouve le premier qui réussit le test, puis renvoie immédiatement cet élément.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Trouver le premier nombre pair
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Pour les situations où aucun élément ne correspond à votre condition, firstWhere() fournit un paramètre optionnel orElse. Ce paramètre accepte une fonction qui renvoie une valeur par défaut lorsqu'aucune correspondance n'est trouvée, empêchant votre programme de planter avec une erreur.
Défi
FacileCréez un programme qui gère un système de service client en trouvant la première plainte client nécessitant une attention immédiate. Votre programme doit :
- Lire une chaîne de caractères en entrée représentant le nom du département
- Lire plusieurs entiers en entrée représentant les niveaux de priorité des plaintes (la saisie s'arrête lorsque vous recevez
-1) - Lire un entier en entrée représentant le seuil de priorité urgente
- Utiliser la méthode
firstWhere()pour trouver la première plainte ayant un niveau de priorité supérieur ou égal au seuil d'urgence - Afficher les résultats du service client exactement au format indiqué ci-dessous
Par exemple, si le nom du département est "Technical Support", les niveaux de priorité sont 3, 7, 2, 9, 4, et le seuil d'urgence est 8, votre programme doit afficher :
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 requiredSi le nom du département est "Billing Department", les niveaux de priorité sont 4, 6, 3, 5, et le seuil d'urgence est 7, votre programme doit afficher :
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 processingSi le nom du département est "Sales Support", les niveaux de priorité sont 10, 2, 8, et le seuil d'urgence est 9, votre programme doit afficher :
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 requiredVotre programme doit utiliser la méthode firstWhere() pour trouver la première priorité de plainte qui est supérieure ou égale au seuil d'urgence. Si aucune plainte urgente n'est trouvée, affichez "Not found" pour la première plainte urgente et affichez "No urgent complaints - continue normal processing" comme statut. Si une plainte urgente est trouvée, affichez le niveau de priorité et affichez "Urgent complaint found - immediate action required" comme statut.
Aide-mémoire
La méthode firstWhere() trouve le premier élément d'une liste qui remplit une condition spécifique. Elle arrête la recherche dès qu'elle trouve une correspondance et renvoie cet élément.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Trouver le premier nombre pair
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Utilisez le paramètre orElse pour fournir une valeur par défaut lorsqu'aucun élément ne correspond à la condition :
// Renvoie une valeur par défaut si aucune correspondance n'est trouvée
int result = numbers.firstWhere(
(number) => number > 100,
orElse: () => -1
);Essayez vous-même
import 'dart:io';
void main() {
// Lire le nom du département
String? department = stdin.readLineSync();
// Lire les niveaux de priorité des plaintes jusqu'à -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// Lire le seuil d'urgence
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: Écrivez votre code ci-dessous
// Utiliser la méthode firstWhere() pour trouver la première plainte >= urgentThreshold
// Afficher les résultats
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// Afficher le résultat de la première plainte urgente
// Afficher le message de statut
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Manipulation avancée des listes
Propriétés de liste : first & lastÉtat de la liste : isEmpty & isNotEmptyInverser une listeAjouter à une liste : insertSuppression dans une liste : removeWhereRechercher dans une liste : indexOfTrier une listeMélanger une listeRécapitulatif - Organisateur de liste4Manipulation avancée des Maps
Itérer sur une MapVérifier les clés et les valeursPropriétés de Map : keys & valuesAjout conditionnel : putIfAbsentSupprimer des entrées d'une MapMaps imbriquéesRécapitulatif - Mise à jour de l'inventaire2Opérations fonctionnelles sur les listes
Transformer avec 'map'Filtrer avec 'where'Utiliser '.toList()'Vérifier des conditions avec 'any'Conditions avec 'every'Trouver avec 'firstWhere'Récapitulatif - Filtrage de données3Les Ensembles
Qu'est-ce qu'un ensemble ?Créer un ensembleAjouter et supprimer des éléments d'un ensembleVérifier la présence d'éléments dans un ensembleConvertir une liste en ensembleUnion d'ensemblesIntersection d'ensemblesDifférence d'ensemblesRécapitulatif - Liste d'invités uniques