Comment fonctionne le tri avec java 8 stream sous le capot?

10

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 sortsous le capot?

InforméA
la source
Pourquoi ai-je un vote négatif avec cette question ???
InformedA
2
Votre question est raisonnable et ne mérite pas de votes négatifs. Vos commentaires sur la réponse d'Amon , cependant ... ugh: |
Andres F.
@AndresF. Le vote à la baisse est intervenu avant même que je fasse ce commentaire. C'est l'une des raisons pour lesquelles j'étais très contrarié.
InformedA
Les commentaires ne sont en aucun cas une raison de voter contre. La question est indépendante et elle est valable à mon avis. Je l'ai voté.
Andres F.

Réponses:

10

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.SortedOpsclasse 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.

amon
la source
1
@InformedA Je ne veux pas suggérer que les lambdas ou les ruisseaux seraient des «conneries sous le capot». Ils sont tous deux incroyablement pratiques, même si les détails concernant les flux sont inhabituellement complexes par rapport à d'autres concepts Java. Si vous voulez vous en tenir à votre idée préconçue que ces outils sont inutiles ou nuisibles, vous vous limitez inutilement.
amon
1
@amon - convenu, plus les flux offrent la possibilité de faire rouler des implémentations parallèles multicœurs sous le capot, sans changer virtuellement l'application. Et la complexité de la mise en œuvre de flux vient exactement de cela. C'est bien plus qu'une simple commodité, c'est une abstraction correcte. Pour l'OP - je vous suggère de lire Mastering Lambdas ... si vous voulez comprendre pourquoi les lambdas et les streams sont tellement plus que des fonctionnalités pratiques.
Yuri Steinschreiber
3
@InformedA: les lambdas existent depuis 80 ans et existent dans à peu près tous les langages de programmation courants actuels. Les flux existent depuis 40 ans et existent également dans presque tous les cadres de collections grand public. Ils peuvent être appelés des choses différentes (itérateurs, listes paresseuses, énumérateurs, énumérables), mais ils sont là. Les lambdas et les listes paresseuses sont quelques-unes des abstractions les plus anciennes et les plus stables qui soient, et elles ont survécu à chaque nouvelle mode, battage médiatique, paradigme, mouvement, méthodologie, technologie, langage, système d'exploitation, cadre, bibliothèque lancée sur eux. Cela leur vaut le détour.
Jörg W Mittag
2
@InformedA Java, le langage de programmation, n'est qu'une abstraction de conneries de bytecode s'exécutant sur la JVM. La JVM elle-même n'est qu'une abstraction de conneries écrite en C (ou C ++, j'oublie). C et C ++ ne sont que des abstractions de conneries sur le langage d'assemblage. Même le langage d'assemblage lui-même est une abstraction de conneries sur microcode, qui est également une abstraction de conneries sur des circuits (ok, je manque peut-être quelques étapes entre les deux). On pourrait dire que tout ce qui est utile dans un logiciel est une "abstraction de conneries" par rapport à autre chose.
Andres F.
3
@InformedA Mon conseil honnête est d'essayer d'apprendre un langage plus orienté vers la programmation fonctionnelle que Java. Même si vous ne l'utilisez jamais pour votre travail de jour, vous comprendrez les langages de programmation et leurs choix de conception qui vous aideront avec Java :)
Andres F.