La réponse est, comme toujours, "ça dépend". Cela dépend de la collection retournée sera. Cela dépend si les changements au fil du temps, et de l'importance de la cohérence du résultat renvoyé est. Et cela dépend beaucoup de la façon dont l'utilisateur est susceptible d'utiliser la réponse.
Tout d'abord, notez que vous pouvez toujours obtenir une Collection à partir d'un Flux, et vice-versa:
// If API returns Collection, convert with stream()
getFoo().stream()...
// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());
Donc la question est, qui est plus utile à vos visiteurs.
Si votre résultat peut être infinie, il n'y a qu'un seul choix: le Flux.
Si votre résultat peut être très grande, vous préférez sans doute Flux, puisqu'il peut ne pas être n'importe quelle valeur à la concrétisation de tout cela à la fois, et cela pourrait créer des tas de pression.
Si tous les appelant va faire est de parcourir (de recherche, de filtrage, d'agrégation), vous devriez préférer les Flux, depuis le Ruisseau a ces déjà et il n'y a pas besoin de matérialiser une collection (surtout si l'utilisateur ne pourrait pas traiter la totalité du résultat.) C'est un cas très commun.
Même si vous savez que l'utilisateur va se répéter plusieurs fois ou au contraire le garder, vous pouvez toujours retourner un Flux au lieu de cela, pour le simple fait que, quelle que soit Collection que vous choisissez de le placer dans (p. ex., liste de tableaux) ne peut pas être la forme qu'ils veulent, et puis l'appelant a copier de toute façon. si vous retournez un flux, qu'ils peuvent faire, collect(toCollection(factory))
et obtenir exactement la forme qu'ils veulent.
Ci-dessus "préfèrent Stream" le cas la plupart découler du fait que le Flux est plus flexible; vous pouvez en retard lié à la façon dont vous l'utiliser sans avoir à supporter les coûts et les contraintes de matérialiser, à une Collection.
Le seul cas où vous devez retourner une Collection, c'est quand il y a de fortes exigences de cohérence, et que vous devez produire une sauvegarde instantanée d'une cible en mouvement. Ensuite, vous aurez envie de mettre les éléments dans une collection qui ne changera pas.
Donc, je dirais que la plupart du temps, le Flux est la bonne réponse (il est plus souple, il n'impose pas de d'habitude-inutile matérialisation des coûts, et peut être facilement transformé en la Collection de votre choix si nécessaire. Mais parfois, vous pourriez avoir à retourner une Collection (par exemple, en raison des fortes exigences de cohérence), ou vous souhaitez peut-être le retour de la Collection parce que vous savez comment l'utilisateur va utiliser et savent que c'est la chose la plus commode pour eux.