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

Comment trouver 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 procéder avec Java.

Lectures complémentaires:

Vérifier si une liste est triée en Java

Apprenez plusieurs algorithmes pour vérifier si une liste est triée en Java.

Read more

Initialisation de liste Java en une seule ligne

Dans ce rapide didacticiel, nous allons étudier comment initialiser une liste à l'aide de one-liners.

Read more

2. Installer

Commençons par définir un POJOCustomer:

public class Customer {

    private int id;
    private String name;

    // getters/setters, custom hashcode/equals
}

Et unArrayList 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 etequals dans notre classeCustomer.

Sur la base de notre implémentation actuelle deequals, deux objetsCustomer avec le mêmeid seront considérés comme égaux.

Nous utiliserons cette liste decustomers en cours de route.

3. Utilisation de l'API Java

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

  • La méthodecontains

  • La méthodeindexOf 

  • An ad-hoc for loop, et

  • LeStream API

3.1. contains()

List expose une méthode appeléecontains:

boolean contains(Object element)

Comme son nom l'indique, cette méthode renvoietrue si la liste contient leselement, spécifiés et renvoiefalse dans le cas contraire. 

Donc, quand nous devons juste vérifier si un élément spécifique existe dans notre liste, nous pouvons faire:

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

3.2. indexOf()

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 deselement spécifiés dans la liste donnée, ou -1 si la liste ne contient pas leselement.

Donc, logiquement, si cette méthode retourne 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

Mais que se passe-t-il si nous souhaitons rechercher un élément dans un champ? Disons que nous annonçons une loterie et que nous devons déclarer unCustomer avec unname spécifique comme gagnant.

Pour de telles recherches sur le terrain, nous pouvons nous tourner vers l'itération.

Une façon traditionnelle d'itérer dans une liste est d'utiliser l'une des constructionsJava’s looping. À 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, lename fait référence au nom que nous recherchons dans la liste donnée decustomers. Cette méthode renvoie le premier objetCustomer de la liste avec unname correspondant, etnull s'il n'existe aucunCustomer.

3.4. Boucle avec unIterator

Iterator est une autre façon de parcourir une liste d'éléments.

Nous pouvons simplement prendre notre exemple précédent et le modifier 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;
}

Et le comportement est le même que précédemment.

3.5. API Java 8Stream

Depuis Java 8, on peut aussiuse the Stream API pour trouver un élément dans unList.

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

  • invoquerstream() sur la liste

  • appeler la méthodefilter() avec unPredicate propre

  • appeler la sconstructfindAny() qui renvoiethe first element that matches the filter predicate wrapped in an Optional si un tel élément existe **

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

Pour plus de commodité, nous utilisons par défautnull dans le cas où unOptional est vide, mais ce n'est peut-être pas toujours le meilleur choix pour chaque scénario.

4. Bibliothèques tierces

Maintenant, alors que l'API Stream est plus que suffisante,what should we do if we’re stuck on an earlier version of Java?

Heureusement, il existe de nombreuses bibliothèques tierces telles que Google Guava et Apache Commons que nous pouvons utiliser.

4.1. Google Guava

Google Guava fournit des fonctionnalités similaires à celles que nous pouvons utiliser avec les flux:

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

Comme nous pouvons avec l'APIStream, nous pouvons éventuellement choisir de renvoyer une valeur par défaut au lieu denull:

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

Le code ci-dessus choisira le premier élément de la liste si aucune correspondance n'est trouvée.

Et n'oubliez pas que Guava lance unNullPointerException si la liste ou le prédicat estnull.

4.2. Apache Commons

Nous pouvons trouver un élément presque de la même manière en utilisant 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 justenull  si nous passons une liste denull

  2. Il  ne fournit pas de fonctionnalité de valeur par défaut comme lestryFind de Guava

5. Conclusion

Dans cet article, nous avons appris différentes façons de trouver un élément dans unList, sen commençant par des vérifications d'existence rapides et en terminant par des recherches basées sur les champs.

Nous avons également examiné les bibliothèques tiercesGoogle Guava etApache Commons comme alternatives à l'API Java 8Streams.

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