Wie funktioniert das Sortieren mit Java 8 Stream unter der Haube?

10

Wenn ich aufrufe, Stream.sort(..)wird ein neues Array von Elementen erstellt und der Stream iteriert über das neu erstellte sortierte Array?

Mit anderen Worten, wie funktioniert Java 8 Stream sortunter der Haube?

InformiertA
quelle
Warum bekomme ich mit dieser Frage eine Abwertung ???
Informiert
2
Ihre Frage ist vernünftig und verdient keine Gegenstimmen. Ihre Kommentare zu Amons Antwort jedoch ... ugh: |
Andres F.
@AndresF. Die Abwertung erfolgte noch bevor ich diesen Kommentar abgegeben habe. Dies ist einer der Gründe, warum ich sehr verärgert war.
Informiert
Die Kommentare sind sowieso kein Grund zur Ablehnung. Die Frage steht für sich allein und ist meiner Meinung nach gültig. Ich habe es positiv bewertet.
Andres F.

Antworten:

10

Sie können grepcode.com verwenden , um den Java-Standardbibliothekscode (und einige andere Bibliotheken) zu durchsuchen. Leider ist der Stream-Implementierungscode eher abstrakt. Ein guter Ausgangspunkt ist die interne java.util.stream.SortedOpsKlasse, die einen Stream in einen sortierten Stream umwandelt.

Die aktuelle Implementierung (die für Streams von Standardbibliothekscontainern verwendet wird) macht es zu einem No-Op, wenn der Stream bereits sortiert ist, verwendet ein Array, wenn die Größe des Streams bekannt ist ( SizedRefSortingSink), oder akkumuliert alle Elemente in einer ArrayList, wenn die Größe ist unbekannt ( RefSortingSink).

Natürlich können sich solche Implementierungsdetails mit jeder Version ändern, aber die grundlegenden Überlegungen sind universell: Das Sortieren eines Streams ist notwendigerweise eine eifrige / blockierende Operation, und das Sortieren eines unendlichen Streams ist nicht sinnvoll. Dies bedeutet, dass das Sortieren eines Streams nicht nützlich ist, wenn Sie Streams verwenden, da diese faul sein können, Sie aber dennoch die bequeme Stream-Syntax erhalten.

Andere Streams müssen ihre eigene Implementierung bereitstellen Stream.sorted(), was wahrscheinlich ähnlich sein wird.

amon
quelle
1
@InformedA Ich möchte nicht vorschlagen, dass Lambdas oder Streams "Bullshit under the Hood" sind. Sie sind beide unglaublich praktisch, obwohl die Details zu Streams im Vergleich zu anderen Java-Konzepten ungewöhnlich komplex sind. Wenn Sie an Ihrer vorgefertigten Vorstellung festhalten möchten, dass diese Tools nutzlos oder schädlich sind, beschränken Sie sich unnötig.
Amon
1
@amon - vereinbart, plus Streams bieten die Möglichkeit, parallele Multicore-Implementierungen unter die Haube zu rollen, ohne die Anwendung virtuell zu ändern. Und die Komplexität der Stream-Implementierung ergibt sich genau daraus. Das ist weit mehr als nur Bequemlichkeit, das ist die richtige Abstraktion. Zum OP - Ich schlage vor, Sie lesen Mastering Lambdas ... wenn Sie verstehen möchten, warum Lambdas und Streams so viel mehr sind als nur praktische Funktionen.
Yuri Steinschreiber
3
@InformedA: Lambdas gibt es seit 80 Jahren und gibt es in so ziemlich jeder aktuellen Mainstream-Programmiersprache. Streams gibt es seit 40 Jahren und sie existieren ebenfalls in so ziemlich jedem Mainstream-Sammlungs-Framework. Sie können verschiedene Dinge genannt werden (Iteratoren, Lazy Lists, Enumeratoren, Enumerables), aber sie sind da. Lambdas und Lazy Lists gehören zu den ältesten und stabilsten Abstraktionen, die es gibt, und sie haben jede neue Modeerscheinung, jeden neuen Hype, jedes neue Paradigma, jede neue Bewegung, Methodik, Technologie, Sprache, Betriebssystem, Framework und Bibliothek überstanden. Das macht sie einen Blick wert.
Jörg W Mittag
2
@InformedA Java, die Programmiersprache, ist nur eine Bullshit-Abstraktion von Bytecode, der auf der JVM ausgeführt wird. Die JVM selbst ist nur eine Bullshit-Abstraktion, die in C geschrieben ist (oder C ++, ich vergesse). C und C ++ sind nur Bullshit-Abstraktionen über Assemblersprache. Sogar die Assemblersprache selbst ist eine Bullshit-Abstraktion über Mikrocode, die auch eine Bullshit-Abstraktion über Schaltkreise ist (ok, ich vermisse möglicherweise ein paar Schritte dazwischen). Man könnte sagen, alles, was in Software nützlich ist, ist eine "Bullshit-Abstraktion" über etwas anderes.
Andres F.
3
@InformedA Mein ehrlicher Rat ist, dass Sie versuchen, eine Sprache zu lernen, die mehr auf funktionale Programmierung als auf Java ausgerichtet ist. Selbst wenn Sie es nie für Ihre tägliche Arbeit verwenden, werden Sie ein Verständnis der Programmiersprachen und ihrer Designoptionen erlangen, die Ihnen bei Java helfen werden :)
Andres F.