"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Java Streams : le guide ultime pour les débutants complets

Java Streams : le guide ultime pour les débutants complets

Publié le 2024-11-04
Parcourir:800

Donc, vous êtes ici pour en savoir plus sur les Ruisseaux en Java, mais pas sur le genre de cours d'eau où les gens vont à la pêche ou où l'eau coule. Nous parlons de flux de données, une fonctionnalité puissante introduite dans Java 8 qui facilite grandement le travail avec les données. Que vous soyez nouveau dans ce domaine ou que vous l'ayez essayé mais que vous n'ayez pas réussi à le résoudre, ne vous inquiétez pas. Je vous guiderai tout au long du voyage dans un langage simple et facile à comprendre.

Prêt? Plongeons-nous dans Java Streams !


Java Streams: The Ultimate Guide for Complete Beginners


Qu’est-ce qu’un flux en Java ?

Un Stream est un moyen de traiter des données dans une séquence. Imaginez que vous ayez une liste d'éléments et que vous souhaitiez faire quelque chose avec ces éléments (filtrer, trier, cartographier, etc.). Un Stream vous permet de faire tout cela de manière propre et efficace. C'est comme une chaîne de montage où vos données passent par différentes étapes jusqu'à ce qu'elles soient traitées.

Éléments clés à retenir à propos des flux : 

  1. Les flux ne modifient pas les données d'origine. Considérez-les comme une vue ou un pipeline sur vos données.
  2. Les flux traitent les données paresseusement, ce qui signifie qu'ils n'effectuent aucun travail réel jusqu'à ce que vous leur disiez de produire un résultat final. Cela évite des calculs inutiles.
  3. Les flux sont à usage unique. Une fois qu’un flux a été consommé, il disparaît. Vous devrez en créer un nouveau si vous souhaitez le réutiliser.

Pourquoi utiliser les flux ?

Pourquoi ne pas simplement utiliser une boucle for ou manipuler directement les collections ? Eh bien, il y a trois raisons principales :

  • Cleaner Code : pas besoin d'écrire des boucles répétitives et volumineuses. Les flux vous offrent un moyen clair et lisible de traiter les données.
  • Meilleures performances : avec une évaluation paresseuse, les flux traitent les données plus efficacement. Ils ne travaillent sur les données que lorsque cela est nécessaire, ce qui peut permettre de gagner du temps de traitement.
  • Style fonctionnel : les flux apportent un style de programmation plus déclaratif et fonctionnel à Java, ce qui signifie que vous vous concentrez sur ce que vous voulez faire, et non sur comment.

Comment fonctionnent les flux ? Les bases

Jetons un coup d'œil aux deux principaux types d'opérations de flux : Intermédiaire et Terminal.

1. Opérations intermédiaires

Ce sont les opérations qui préparent les données mais ne produisent pas de résultat final immédiatement. Considérez-les comme les étapes de « l'atelier ».

  • filtre()

    C'est comme un tamis. Il sélectionne des éléments en fonction d'une condition. Par exemple, si vous souhaitez uniquement les nombres pairs d'une liste d'entiers, vous utiliserez filter().

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 3, 4, 5);
    List evenNumbers = numbers.stream()
                                       .filter(n -> n % 2 == 0)
                                       .collect(Collectors.toList());
    // Output: [2, 4]
    
    

    Pourquoi filtrer ? Sans filter(), vous devrez parcourir manuellement la liste et ajouter uniquement les éléments correspondants à une nouvelle liste. filter() vous permet de le faire en une seule étape propre.

  • carte()

    Ceci est un transformateur. Il prend un élément et renvoie quelque chose de différent. Par exemple, si vous avez une liste de chaînes et que vous souhaitez connaître la longueur de chaque chaîne :

    java
    Copy code
    List words = Arrays.asList("apple", "banana", "cherry");
    List lengths = words.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
    // Output: [5, 6, 6]
    
    

    Pourquoi map ? map() est utilisé lorsque vous devez transformer chaque élément en quelque chose d'autre, comme convertir une liste de chaînes en une liste de leurs longueurs.

  • distinct()

    C'est comme un filtre en double. Cela supprime les éléments en double d'un flux.

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
    List distinctNumbers = numbers.stream()
                                           .distinct()
                                           .collect(Collectors.toList());
    // Output: [1, 2, 3, 4, 5]
    
    

    Pourquoi distinct ? Dans une liste normale, vous devrez vérifier manuellement les doublons. distinct() fait cela pour vous sur une seule ligne.

  • trié()

    Cela trie vos données dans un ordre naturel (ou personnalisé, si vous le souhaitez).

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List sortedNames = names.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
    // Output: ["Alice", "Bob", "Charlie"]
    
    

    Pourquoi trié ? Au lieu d'écrire vous-même une logique de tri, sorted() la gère pour vous.

2. Opérations des terminaux

Ce sont ceux qui produisent le résultat final et qui déclenchent le traitement de l'intégralité du flux. Considérez-les comme le « point de sortie ».

  • collecter()

    Il s'agit de l'opération de terminal la plus courante. Il rassemble les résultats du flux et les place dans une liste, un ensemble ou une autre collection.

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List upperNames = names.stream()
                                   .map(String::toUpperCase)
                                   .collect(Collectors.toList());
    // Output: ["CHARLIE", "ALICE", "BOB"]
    
    

    Pourquoi collecter ? Vous utiliserez presque toujours collect() pour rassembler les résultats de votre flux dans une collection. C'est votre dernier arrêt.

  • pourEach()

    Si vous n'avez pas besoin d'un résultat et que vous souhaitez simplement effectuer une action sur chaque élément (comme les imprimer), forEach() est votre ami.

    java
    Copy code
    numbers.stream()
           .forEach(System.out::println);
    
    

    Pourquoi forEach ? C'est parfait pour les effets secondaires, comme l'impression de données sur la console ou l'écriture dans un fichier.

  • réduire()

    reduce() prend un tas de données et les résume à un seul résultat. Par exemple, additionner une liste de nombres :

    java
    Copy code
    int sum = numbers.stream()
                     .reduce(0, Integer::sum);
    // Output: 15
    
    

    Pourquoi réduire ? Lorsque vous devez combiner ou accumuler des valeurs en un seul résultat, réduire() est votre solution.


Autres types de flux

Tous les flux ne sont pas créés à partir de collections. Java fournit d'autres types de flux pour gérer différents types de données :


Java Streams: The Ultimate Guide for Complete Beginners


  1. IntStream, LongStream, DoubleStream

    Ces flux sont spécialisés pour traiter les types primitifs. Au lieu de boxer et de déballer des valeurs telles que Stream, vous les utilisez pour éviter les pénalités de performances.

    Exemple:

    java
    Copy code
    IntStream intStream = IntStream.of(1, 2, 3, 4);
    int sum = intStream.sum();  // Output: 10
    
    
  2. Flux de fichiers

    Vous pouvez créer des flux à partir de fichiers à l'aide de Files.lines().

    java
    Copy code
    try (Stream lines = Files.lines(Paths.get("data.txt"))) {
        lines.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    

    Pourquoi utiliser les flux de fichiers ? Lorsqu'il s'agit de fichiers volumineux, le chargement de toutes les données en mémoire peut ne pas être efficace. Utiliser un flux permet de le traiter ligne par ligne.


Quand utiliser les flux ?

  • Transformation des données : lorsque vous devez modifier chaque élément d'une collection.
  • Filtrage : lorsque vous souhaitez sélectionner uniquement les données qui correspondent à certaines conditions.
  • Agrégation de données : lorsque vous devez réduire une collection en un seul résultat (par exemple, somme, moyenne).
  • Traitement parallèle : les flux prennent également en charge le parallélisme. Avec .parallelStream(), vous pouvez répartir vos tâches sur plusieurs threads pour un traitement plus rapide.

Flux ou boucles : pourquoi ne pas simplement utiliser des boucles ?

Bonne question ! Comparons :

  1. Lisibilité : avec Streams, vous vous concentrez sur ce que vous voulez faire, et non sur comment. Les boucles ont tendance à vous faire écrire beaucoup de code passe-partout supplémentaire (comme des compteurs et des conditions).
  2. Performances : les flux sont optimisés pour gérer efficacement les données volumineuses, en particulier avec une évaluation paresseuse et un parallélisme. Les boucles n'offrent pas de telles optimisations prêtes à l'emploi.
  3. Flexibilité : les flux vous permettent d'enchaîner les opérations (comme le filtrage, le mappage et la réduction) dans un style propre et fonctionnel. Les boucles nécessiteraient que vous y imbriquiez plus de logique.

Conclusion

Les flux en Java visent à simplifier la façon dont vous traitez les données. Ils rendent votre code plus lisible, plus facile à maintenir et plus efficace lorsque vous travaillez avec des collections. Que vous filtriez, transformiez ou réduisiez des données, Streams vous propose des méthodes claires et simples qui éliminent le besoin de boucles volumineuses et de travail manuel.

Maintenant que vous maîtrisez les bases de Streams, pourquoi vous arrêter ici ? Suivez-moi sur Twitter, LinkedIn ou consultez mon blog pour plus de conseils Java qui feront de vous un pro en un rien de temps ! Et si vous avez trouvé ce guide utile, partagez-le avec vos collègues développeurs, car partager, c'est prendre soin !


Prêt à l'essayer ? Faisons circuler ce flux dans votre prochain projet !

Déclaration de sortie Cet article est reproduit sur : https://dev.to/wittedtech-by-harshit/java-streams-the-ultimate-guide-for-complete-beginners-40e2?1 En cas de violation, veuillez contacter study_golang@163 .com pour le supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3