Когда я вызываю, Stream.sort(..)
создается ли новый массив элементов, и поток перебирает вновь созданный отсортированный массив?
Другими словами, как работает Java 8 Stream sort
под капотом?
java
java8
stream-processing
InformedA
источник
источник
Ответы:
Вы можете использовать grepcode.com для поиска кода стандартной библиотеки Java (и некоторых других библиотек). К сожалению, код реализации потока довольно абстрактный. Хорошей отправной точкой является внутренний
java.util.stream.SortedOps
класс, который преобразует поток в отсортированный поток.Текущая реализация (используется для потоков стандартных библиотеки контейнеров) делает его не-оп , если поток уже отсортирован, использует массив , если размер потока известен (
SizedRefSortingSink
), или накапливают все элементы в ArrayList , если размер неизвестно (RefSortingSink
).Конечно, такие подробности реализации могут меняться с любым выпуском, но фундаментальные соображения универсальны: сортировка потока обязательно является операцией нетерпеливого / блокирующего, а сортировка бесконечного потока не имеет смысла. Это означает, что сортировка потока бесполезна, если вы используете потоки, потому что они могут быть ленивыми, но вы все равно получаете удобный синтаксис потока.
Другие потоки должны будут обеспечить собственную реализацию
Stream.sorted()
, которая, вероятно, будет аналогичной.источник