Kiedy dzwonię, Stream.sort(..)
czy tworzona jest nowa tablica elementów, a strumień iteruje po nowo utworzonej posortowanej tablicy?
Innymi słowy, jak Java 8 Stream działa sort
pod maską?
Kiedy dzwonię, Stream.sort(..)
czy tworzona jest nowa tablica elementów, a strumień iteruje po nowo utworzonej posortowanej tablicy?
Innymi słowy, jak Java 8 Stream działa sort
pod maską?
Odpowiedzi:
Możesz użyć grepcode.com, aby przeszukać standardowy kod biblioteki Java (i niektóre inne biblioteki). Niestety kod implementacji strumienia jest raczej abstrakcyjny. Dobrym punktem wyjścia jest java.util.stream.SortedOps
klasa wewnętrzna, która przekształca strumień w posortowany strumień.
Prąd realizacja (stosowany dla strumieni standardowych kontenerów biblioteki) sprawia, że rozkaz pusty, jeżeli strumień jest już posortowana wykorzystuje tablicę jeżeli wielkość strumienia jest znany ( SizedRefSortingSink
) lub gromadzi wszystkie elementy ArrayList Jeżeli rozmiar nieznany ( RefSortingSink
).
Oczywiście takie szczegóły implementacji mogą ulec zmianie w każdej wersji, ale podstawowe uwagi są uniwersalne: Sortowanie strumienia jest koniecznie operacją chętną / blokującą, a sortowanie strumienia nieskończonego nie ma znaczenia. Oznacza to, że sortowanie strumienia nie jest przydatne, jeśli używasz strumieni, ponieważ mogą być leniwe, ale nadal masz wygodną składnię strumienia.
Inne strumienie będą musiały zapewnić własną implementację Stream.sorted()
, która prawdopodobnie będzie podobna.