samedi 27 avril 2024

Java : Différences entre findFirst() et findAny() dans l’API Stream de Java


L’API Stream de Java offre deux méthodes terminales intéressantes : findFirst() et findAny().
Ces méthodes sont utilisées pour récupérer des éléments d’un flux, mais elles ont des comportements légèrement différents.
Explorons ces différences et examinons comment elles s’appliquent dans le monde réel.

1. findFirst()

La méthode findFirst() renvoie le premier élément du flux en fonction de l’ordre de rencontre du flux. Voici quelques exemples d’utilisation :

Exemple 1 : Trouver le premier élément d’une liste

List<String> fruits = Arrays.asList("pomme", "banane", "cerise", "datte");
Optional<String> premierFruit = fruits.stream().findFirst();
premierFruit.ifPresent(fruit -> System.out.println("Premier fruit : " + fruit));

Dans cet exemple, findFirst() renverra toujours “pomme” car l’ordre d’itération est déterministe dans une liste.

Exemple 2 : Utilisation avec des objets complexes

Supposons que nous ayons une liste d’objets Personne :

class Personne {
    private String nom;
    // autres propriétés et méthodes
}

List<Personne> personnes = // récupération des données depuis une source
Optional<Personne> premierePersonne = personnes.stream().findFirst();

Dans ce cas, findFirst() renverra la première personne rencontrée dans la liste.

2. findAny()

La méthode findAny() renvoie n’importe quel élément du flux, sans garantie sur lequel sera renvoyé. Cela permet plus de flexibilité dans les flux parallèles. Voici comment l’utiliser :

Exemple 3 : Trouver n’importe quel élément

List<Integer> nombres = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> nombreQuelconque = nombres.stream().findAny();
nombreQuelconque.ifPresent(n -> System.out.println("Nombre quelconque : " + n));

En mode séquentiel, findAny() renverra probablement le premier élément, mais ce n’est pas garanti. En mode parallèle, il peut renvoyer n’importe quel élément qui termine son traitement en premier.

Exemple 4 : Utilisation dans un contexte réel

Supposons que nous ayons une liste de commandes clients à traiter. Nous voulons simplement récupérer une commande pour la traiter en parallèle :

List<Commande> commandes = // récupération des commandes depuis une base de données
Optional<Commande> commandeQuelconque = commandes.stream().findAny();

Dans ce cas, findAny() nous permet de récupérer rapidement une commande à traiter, sans nous soucier de l’ordre.

Conclusion

En résumé, utilisez findFirst() lorsque l’ordre est important (par exemple, dans les listes) et findAny() lorsque vous avez besoin de flexibilité (surtout dans les flux parallèles). Choisissez judicieusement en fonction du contexte de votre application !


Aucun commentaire:

Enregistrer un commentaire

to criticize, to improve