Tout en développant mon API qui n'est liée à aucun code hérité, je me retrouve souvent à écrire des méthodes qui sont purement et simplement terminées par le pipeline Streams en collectant les résultats. Comme celui-ci:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Maintenant, la plupart des clients de cette classe auront généralement besoin de la collection (dans ce cas, un ensemble immuable) pour rechercher des éléments et les itérer, mais certains clients peuvent bénéficier d'un flux afin de pouvoir diriger plus d'opérations en plus de cela. Diffusez sans avoir besoin d'obtenir un nouveau flux de la collection. Donc, renvoyer un Stream donne aux cliens un sur-ensemble d'options qu'ils auraient s'ils avaient juste la Collection (après tout, ils peuvent toujours collect()
le Stream eux-mêmes:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Cette approche est tentante pour moi d'essayer car je ne vois pas de défauts potentiels qu'elle pourrait avoir. Cependant, je n'ai jamais vu cette approche dans aucune bibliothèque (probablement parce qu'il n'y avait pas beaucoup de bibliothèques publiées après l'apparition de Java 8), j'ai donc un peu peur de l'adopter. Les classes de bibliothèque existantes renvoient généralement des collections lorsqu'elles dérivent quelque chose de l'état privé.
Y a-t-il quelque chose de mal qui pourrait se produire si je décidais de retourner un Stream partout où mon moi pré-Java-8 retournerait une Collection? Ou est-ce que je fais ici quelque chose d'anti-modèle avec tout ce qui dérive de l'état privé?