Lorsque j'appelle, Stream.sort(..)
y a-t-il un nouveau tableau d'éléments créé et le flux itère sur le tableau trié nouvellement créé?
En d'autres termes, comment Java 8 Stream fonctionne-t-il sort
sous le capot?
Lorsque j'appelle, Stream.sort(..)
y a-t-il un nouveau tableau d'éléments créé et le flux itère sur le tableau trié nouvellement créé?
En d'autres termes, comment Java 8 Stream fonctionne-t-il sort
sous le capot?
Réponses:
Vous pouvez utiliser grepcode.com pour rechercher dans le code de bibliothèque standard Java (et certaines autres bibliothèques). Malheureusement, le code d'implémentation du flux est plutôt abstrait. Un bon point de départ est la java.util.stream.SortedOps
classe interne qui transforme un flux en un flux trié.
L' implémentation actuelle (utilisée pour les flux de conteneurs de bibliothèque standard) en fait un no-op si le flux est déjà trié, utilise un tableau si la taille du flux est connue ( SizedRefSortingSink
), ou accumule tous les éléments dans une ArrayList si la taille est inconnu ( RefSortingSink
).
Bien sûr, ces détails d'implémentation peuvent changer avec n'importe quelle version, mais les considérations fondamentales sont universelles: le tri d'un flux est nécessairement une opération ardente / bloquante, et le tri d'un flux infini n'a pas de sens. Cela signifie que le tri d'un flux n'est pas utile si vous utilisez des flux car ils peuvent être paresseux, mais vous obtenez toujours la syntaxe de flux pratique.
D'autres flux devront fournir leur propre implémentation Stream.sorted()
, qui sera probablement similaire.