Java 8 Stream est-il un type de retour sécurisé?
Les flux Java 8 sont-ils des types de retour sûrs pour les méthodes publiques, en ce sens qu'il serait impossible de muter l'objet sous-jacent étant donné un flux à partir de celui-ci?
Par exemple, si j'ai List
et return list.stream();
la valeur de retour pourrait-elle être utilisée de quelque manière que ce soit pour muter la liste d'origine?
À en juger par l'API, je ne pense pas que ce soit possible mais je voudrais confirmer.
1 answers
Oui, il est sûr de le faire. Les flux ne modifient pas/ne doivent pas modifier la structure de données sous-jacente.
Quelques extraits de java.util.stream.Stream
:
Un séquence d'éléments [...].
Les collections et les flux, tout en présentant des similitudes superficielles, ont des objectifs différents. Les collections portent principalement sur la gestion efficace de leurs éléments et l'accès à ceux-ci. En revanche, les flux ne fournissent pas un moyen d'accéder directement ou de manipuler leurs éléments [...].
Pour conserver un comportement correct, les [paramètres comportementaux des opérations de flux must] doivent être non interférents (ils ne modifient pas la source du flux).
Et de Paquet java.util.stream
Description:
Les flux diffèrent des collections de plusieurs façons:
- Pas de stockage. Un flux n'est pas une structure de données qui stocke des éléments; au lieu de cela, il transmet des éléments à partir d'une source [ ... ], via un pipeline des opérations de calcul.
- De nature fonctionnelle. Une opération sur un flux produit un résultat, mais ne modifie pas sa source.
Vous pourriez aussi voir Non-interférence.
[...] il serait impossible de muter l'objet sous-jacent en lui donnant un flux.
Alors qu'il serait possibled'écrire notre propre implémentation de java.util.Stream
qui a modifié le structure de données sous-jacente, ce serait une erreur de le faire. ; )
En réponse au commentaire de @AlexisC.:
Obtenir un flux de la liste [.] peut modifier soncontenu s'il contient des objets mutables.
C'est un point juste. Si nous avons un flux de éléments qui sont mutables, nous pouvons faire:
myObj.stream().forEach(( Foo foo ) -> ( foo.bar = baz ));