Dans les bibliothèques lourdes lambda pré-Java 8 comme Guava, les sorties utilisent des interfaces Java Collection Framework communes, il est donc facile de les transmettre aux API externes / internes et de toujours exploiter certains calculs paresseux si la méthode de bibliothèque le fait (par exemple, paresseux filter()
et transform()
).
Cependant, dans Java 8 Streams, l'appel pour obtenir un terminal Collection
/ Map
est (c'est-à-dire désireux) et il allouera également de nouvelles structures de données pour conserver les résultats.
Pour les calculs compliqués avec plusieurs étapes et modèle de stratégie au milieu, cela provoque beaucoup d'allocations inutiles en raison des résultats intermédiaires.
Alors, les gens pensent-ils que c'est une bonne pratique pour les API internes (c'est-à-dire les stratégies de modèle de stratégie) de prendre et de retourner des Stream
s ou devrais-je simplement revenir aux API paresseuses mais non rationalisées (jeu de mots je suppose)?
Éditer:
Ma principale préoccupation Stream
est qu'il ne peut être consommé qu'une seule fois et que passer quelque chose comme un Supplier<Stream<X>>
semble extrêmement lourd. Cela vous pousse presque à passer un Collection
et puis à le refaire stream()
(et à payer le coût d'une évaluation avide à ce point).