• Home
  • Docker
  • Kubernetes
  • LLMs
  • Java
  • Ubuntu
  • Maven
  • Big Data
  • Archived
Java | Streams
  1. L'interface Stream
  2. Package "java.util.stream"
  3. Méthodes de l'interface Stream
  4. Utilisation des streams avec les collections

  1. L'interface Stream
    Java permet de construire un flux de traitement (ou un pipeline) qui contient un ensemble d'étapes (ou opérations) qui s’appliquent en série sur les éléments d’une source de données.

    Les opérations qui peuvent être appliquées sur un flux sont de deux types : des opérations intermédiaires (intermediate operations) ou des opérations terminales (terminal operation).

    • Le flux de traitement commence par créer une instance de l’interface java.util.stream.Stream à partir d’une source de données (collection, tableau, ensemble d’éléments).

      Exemples :

    • Les opérations intermédiaires du pipeline produisent une nouvelle instance de l’interface Stream.

      Exemples :

    • L’opération terminale du pipeline produit un résultat ou un effet de bord. Cette opération ferme le flux.

      Exemples :

    • Les opérations intermédiaires sont exécutées uniquement si l'opération terminale est initiée. Autrement dit, les opérations intermédiaires d’un pipeline ne seront jamais exécutées si le pipeline ne declare pas une operation terminale.

      Aussi les éléments de la source de données sont consommés uniquement au besoin.

      Exemples :

    • Une seule opération terminale peut s'appliquer sur une instance Stream.

      Si une deuxième opération (intermédiaire ou terminale) est appliquée sur une instance Stream après l'exécution de l'opération terminale, une exception va être déclenchée :
      "java.lang.IllegalStateException: stream has already been operated upon or closed".

      Exemples :

    • La chaine des operations qui peuvent être appliquées sur une séquence des éléments peuvent être exécutées en série (par défaut) ou en parallèle.

      Exemples :
  2. Package "java.util.stream"
    La librairie Java fournit une liste des interfaces pour manipuler les streams qui se trouvent dans le package "java.util.stream":

    • BaseStream: BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable

      Interface de base pour les classes qui manipulent les flux.

      • Stream: Stream<T> extends BaseStream<T, Stream<T>>
        C'est la principale spécialisation de l'interface "BaseStream".
        Elle définit plusieurs méthodes de transformation, filtrage, agrégation, … (filter, map, reduce, distinct, count, ...).

      • IntStream: IntStream extends BaseStream<Integer, IntStream>
        Cette interface est une spécialisation de l'interface "BaseStream" en spécifiant le type du parameter "T" a "Integer".
        Elle définit plusieurs méthodes de transformation, filtrage, agrégation, … (filter, map, reduce, distinct, count, ...).

      • LongStream: LongStream extends BaseStream<Long, LongStream>
        Cette interface est une spécialisation de l'interface "BaseStream" en spécifiant le type du parameter "T" a "Long".
        Elle définit plusieurs méthodes de transformation, filtrage, agrégation, … (filter, map, reduce, distinct, count, ...).

      • DoubleStream: DoubleStream extends BaseStream<Double, DoubleStream>
        Cette interface est une spécialisation de l'interface "BaseStream" en spécifiant le type du parameter "T" a "Double".
        Elle définit plusieurs méthodes de transformation, filtrage, agrégation, … (filter, map, reduce, distinct, count, ...).
  3. Méthodes de l'interface Stream
    • collect (opération terminale)
      L’API java définit deux versions de la fonction collect.

      • La première méthode prend trois paramètres:
        <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner);

        Exemples :

      • La deuxième méthode prend un seul paramètre:
        <R, A> R collect(Collector<? super T, A, R> collector);

        Exemples :

    • map (opération intermédiaire)

      Cette méthode applique la fonctionne passée en paramètre sur les éléments du flux et produit un nouveau flux dont les éléments sont le résultat de l’application de cette fonction.

      Exemples :

    • filter (opération intermédiaire)

      Cette méthode applique la fonctionne passée en paramètre qui sert a filtrer les éléments du flux en gardant uniquement ceux qui correspondent au prédicat donné.

      Exemples :

    • findFirst / findAny (opérations terminales)

      findFirst retourne le premier élément du flux.
      findAny retourne arbitrairement un seul élément du flux.

      Ces deux opérations sont des opérations terminales qui arrêtent le traitement sur le flux dès qu’un element est trouvé.

      Exemples :

    • anyMatch / allMatch / noneMatch (opérations terminales)

      anyMatch retourne true si au moins un seul élément du flux correspond au prédicat fourni.
      allMatch retourne true si tous les éléments du flux correspondent au prédicat fourni.
      noneMatch retourne true si aucun des éléments du flux ne correspond au prédicat fourni.

      Ces trois opérations sont des opérations terminales qui arrêtent le traitement sur le flux dès qu’un élément du flux correspond au prédicat fourni (pour l'opération anyMatch et noneMatch) ou qu'un élément du flux ne correspond pas au prédicat fourni (pour l'opération allMatch).

      Exemples :
  4. Utilisation des streams avec les collections
    • stream / parallelStream
      L'interface java.util.Collection définit une implementation par défaut des méthodes stream et parallelStream.

      Les méthodes stream et parallelStream retournent une instance de java.util.stream.Stream dont la source est la collection courante.

      Exemples :
© 2025  mtitek