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.

Author: Radiodef, 2015-04-15

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 ));
 13
Author: Radiodef, 2015-04-14 22:16:26