Comment rechercher un élément dans une liste avec Java

1. Vue d'ensemble

Trouver un élément dans une liste est une tâche très courante que nous rencontrons en tant que développeurs.

Dans ce rapide didacticiel, nous aborderons différentes manières de le faire avec Java.

2. Configuration

Commençons par définir un POJO client :

public class Customer { private int id; private String name; // getters/setters, custom hashcode/equals }

Puis une ArrayList de clients:

List customers = new ArrayList(); customers.add(new Customer(1, "Jack")); customers.add(new Customer(2, "James")); customers.add(new Customer(3, "Kelly")); 

Notez que nous avons remplacé hashCode et equals dans notre classe Customer .

Sur la base de notre implémentation actuelle d' égaux , deux objets Customer avec le même identifiant seront considérés comme égaux.

Nous utiliserons cette liste de clients en cours de route.

3. Utilisation de l'API Java

Java lui-même offre plusieurs façons de rechercher un élément dans une liste:

  • La méthode contient
  • La méthode indexOf
  • Une boucle for ad-hoc
  • L' API Stream

3.1. contient ()

List expose une méthode appelée contient :

boolean contains(Object element)

Comme son nom l'indique, cette méthode renvoie true si la liste contient l' élément spécifié et renvoie false dans le cas contraire.

Ainsi, lorsque nous devons vérifier si un élément spécifique existe dans notre liste, nous pouvons:

Customer james = new Customer(2, "James"); if (customers.contains(james)) { // ... }

3.2. Indice de()

indexOf est une autre méthode utile pour rechercher des éléments:

int indexOf(Object element)

Cette méthode renvoie l'index de la première occurrence de l' élément spécifié dans la liste donnée, ou -1 si la liste ne contient pas l' élément .

Donc, logiquement, si cette méthode renvoie autre chose que -1, nous savons que la liste contient l'élément:

if(customers.indexOf(james) != -1) { // ... }

Le principal avantage de l'utilisation de cette méthode est qu'elle peut nous indiquer la position de l'élément spécifié dans la liste donnée.

3.3. Boucle de base

Maintenant, que faire si nous voulons faire une recherche basée sur un champ pour un élément? Par exemple, disons que nous annonçons une loterie et que nous devons déclarer un client avec un nom spécifique comme gagnant.

Pour de telles recherches basées sur des champs, nous pouvons nous tourner vers l'itération.

Une manière traditionnelle d'itérer dans une liste consiste à utiliser l'une des constructions en boucle de Java. À chaque itération, nous comparons l'élément actuel de la liste avec l'élément que nous recherchons pour voir s'il s'agit d'une correspondance:

public Customer findUsingEnhancedForLoop( String name, List customers) { for (Customer customer : customers) { if (customer.getName().equals(name)) { return customer; } } return null; }

Ici, le nom fait référence au nom que nous recherchons dans la liste de clients donnée . Cette méthode renvoie le premier objet Customer de la liste avec un nom correspondant , ou null si aucun client n'existe.

3.4. Boucle avec un itérateur

Iterator est un autre moyen de parcourir une liste d'éléments.

Nous pouvons simplement prendre notre exemple précédent et le peaufiner un peu:

public Customer findUsingIterator( String name, List customers) { Iterator iterator = customers.iterator(); while (iterator.hasNext()) { Customer customer = iterator.next(); if (customer.getName().equals(name)) { return customer; } } return null; }

Par conséquent, le comportement est le même qu'avant.

3.5. API Java 8 Stream

À partir de Java 8, nous pouvons également utiliser l' API Stream pour rechercher un élément dans une liste.

Pour trouver un élément correspondant à des critères spécifiques dans une liste donnée, nous:

  • invoquer stream () sur la liste
  • appeler la méthode f ilter () avec un prédicat approprié
  • appelez la construction findAny () , qui retourne le premier élément qui correspond au prédicat de filtre enveloppé dans une option facultative si un tel élément existe

Customer james = customers.stream() .filter(customer -> "James".equals(customer.getName())) .findAny() .orElse(null);

Pour plus de commodité, nous avons par défaut la valeur null au cas où une option est vide, mais ce n'est peut-être pas toujours le meilleur choix pour chaque scénario.

4. Bibliothèques tierces

Now, while the Stream API is more than sufficient, what should we do if we're stuck on an earlier version of Java?

Fortunately, there are many third-party libraries like Google Guava and Apache Commons which we can use.

4.1. Google Guava

Google Guava provides functionality that is similar to what we can do with streams:

Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).orNull();

Just like with Stream API, we can optionally choose to return a default value instead of null:

Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).or(customers.get(0));

The above code will pick the first element in the list if no match is found.

Also, don't forget that Guava throws a NullPointerException if either the list or the predicate is null.

4.2. Apache Commons

We can find an element in almost the exact same way using Apache Commons:

Customer james = IterableUtils.find(customers, new Predicate() { public boolean evaluate(Customer customer) { return "James".equals(customer.getName()); } });

Il existe cependant quelques différences importantes:

  1. Apache Commons renvoie simplement null si nous transmettons une liste nulle .
  2. Ilne fournit pas de fonctionnalité de valeur par défaut comme tryFind de Guava.

5. Conclusion

Dans cet article, nous avons appris différentes manières de trouver un élément dans une liste, en effectuant des vérifications d'existence rapides et en finissant par des recherches par champ.

Nous avons également examiné les bibliothèques tierces Google Guava et Apache Commons comme alternatives à l' API Java 8 Streams .

Merci d'être passé et n'oubliez pas de consulter toutes les sources de ces exemples sur GitHub.