J'apprends sur les Streams en Java 8. Je suis confus à propos de ce concept:
Une collection est une structure de données en mémoire, qui contient toutes les valeurs que la structure de données possède actuellement: chaque élément de la collection doit être calculé avant de pouvoir être ajouté à la collection. En revanche, un flux est une structure de données conceptuellement fixe dans laquelle les éléments sont calculés à la demande.
Je ne comprends pas. Comment une collection ne peut-elle contenir que des valeurs qui doivent avoir été calculées avant de pouvoir être ajoutées à la collection? Et aussi, que signifie la comparaison d'un flux avec une structure de données fixe?
Vous n'avez pas fourni la source de votre devis, alors laissez-moi vous citer javadoc :
Les flux diffèrent des collections de plusieurs manières:
- Pas de stockage . Un flux n'est pas une structure de données qui stocke des éléments; au lieu de cela, il véhicule des éléments à partir d'une source telle qu'une structure de données, un tableau, une fonction de générateur ou un canal d'E/S, via un pipeline d'opérations de calcul.
- De nature fonctionnelle . Une opération sur un flux produit un résultat, mais ne modifie pas sa source. Par exemple, le filtrage d'un
Stream
obtenu à partir d'une collection produit un nouveauStream
sans les éléments filtrés, plutôt que de supprimer des éléments de la collection source.- Recherche de paresse . De nombreuses opérations de flux, telles que le filtrage, le mappage ou la suppression des doublons, peuvent être implémentées paresseusement, ce qui expose les opportunités d'optimisation. Par exemple, "trouver le premier
String
avec trois voyelles consécutives" n'a pas besoin d'examiner toutes les chaînes d'entrée. Les opérations de flux sont divisées en opérations intermédiaires (produisantStream
) et opérations terminales (produisant de la valeur ou des effets secondaires). Les opérations intermédiaires sont toujours paresseuses.- Peut-être illimité . Alors que les collections ont une taille finie, les flux n'ont pas besoin. Les opérations de court-circuit telles que
limit(n)
oufindFirst()
peuvent permettre aux calculs sur des flux infinis de se terminer en un temps fini.- Consommable . Les éléments d'un ruisseau ne sont visités qu'une seule fois au cours de la vie d'un ruisseau. Comme un
Iterator
, un nouveau flux doit être généré pour revoir les mêmes éléments de la source.
En revanche, un Collection
est un conteneur d'objets (éléments). Vous ne pouvez pas obtenir (récupérer) un objet d'une collection à moins que l'objet n'ait été précédemment ajouté à la collection.