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 sort
unter der Haube?
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 sort
unter der Haube?
Antworten:
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.SortedOps
Klasse, 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.