Коли я дзвоню Stream.sort(..)
, чи створюється новий масив елементів, і потік переходить до новоствореного відсортованого масиву?
Іншими словами, як Java 8 Stream працює sort
під кришкою?
Коли я дзвоню Stream.sort(..)
, чи створюється новий масив елементів, і потік переходить до новоствореного відсортованого масиву?
Іншими словами, як Java 8 Stream працює sort
під кришкою?
Відповіді:
Ви можете використовувати grepcode.com для пошуку за допомогою стандартного коду бібліотеки Java (та деяких інших бібліотек). На жаль, код реалізації потоку досить абстрактний. Хорошим вихідним пунктом є внутрішній java.util.stream.SortedOps
клас, який перетворює потік у відсортований потік.
Поточна реалізація (використовується для потоків стандартних бібліотеки контейнерів) робить його не-оп , якщо потік вже відсортований, використовує масив , якщо розмір потоку відомий ( SizedRefSortingSink
), або накопичують все елементи в ArrayList , якщо розмір невідомо ( RefSortingSink
).
Звичайно, такі деталі реалізації можуть змінюватися з будь-яким випуском, але основні міркування є універсальними: сортування потоку обов'язково є операцією, що охоплює / блокує, а сортування нескінченного потоку не має сенсу. Це означає, що сортування потоку не корисно, якщо ви використовуєте потоки, оскільки вони можуть бути лінивими, але ви все одно отримаєте зручний синтаксис потоку.
Інші потоки повинні будуть забезпечити власну реалізацію Stream.sorted()
, що, ймовірно, буде подібним.