Як працює сортування з потоком java 8 під кришкою?


10

Коли я дзвоню Stream.sort(..), чи створюється новий масив елементів, і потік переходить до новоствореного відсортованого масиву?

Іншими словами, як Java 8 Stream працює sortпід кришкою?


Чому я отримую протилежне голосування з цим питанням ???
ПоінформованоA

2
Ваше запитання є розумним та незаслуговуючим нагромадженням. Однак ваші коментарі до відповіді Амона ... тьфу: |
Андрес Ф.

@AndresF. Проголосування проголосувало ще до того, як я зробив цей коментар. Це одна з причин, чому я дуже засмутився.
ПоінформованоA

Зауваження, все-таки, не є підставою для спростування. Питання стоїть сама по собі, і на мою думку воно справедливе. Я це схвалив.
Андрес Ф.

Відповіді:


10

Ви можете використовувати grepcode.com для пошуку за допомогою стандартного коду бібліотеки Java (та деяких інших бібліотек). На жаль, код реалізації потоку досить абстрактний. Хорошим вихідним пунктом є внутрішній java.util.stream.SortedOpsклас, який перетворює потік у відсортований потік.

Поточна реалізація (використовується для потоків стандартних бібліотеки контейнерів) робить його не-оп , якщо потік вже відсортований, використовує масив , якщо розмір потоку відомий ( SizedRefSortingSink), або накопичують все елементи в ArrayList , якщо розмір невідомо ( RefSortingSink).

Звичайно, такі деталі реалізації можуть змінюватися з будь-яким випуском, але основні міркування є універсальними: сортування потоку обов'язково є операцією, що охоплює / блокує, а сортування нескінченного потоку не має сенсу. Це означає, що сортування потоку не корисно, якщо ви використовуєте потоки, оскільки вони можуть бути лінивими, але ви все одно отримаєте зручний синтаксис потоку.

Інші потоки повинні будуть забезпечити власну реалізацію Stream.sorted(), що, ймовірно, буде подібним.


1
@InformedA Я не хочу припускати, що лямбди або потоки будуть "фігнями під кришкою". Вони обидва неймовірно зручні, навіть якщо деталі щодо потоків незвично складні порівняно з іншими поняттями Java. Якщо ви хочете дотримуватися своєї заздалегідь уявленої думки про те, що ці засоби марні чи шкідливі, ви зайво обмежуєте себе.
амон

1
@amon - погоджено, плюс потоки забезпечують можливість прокручування багатоядерних паралельних реалізацій під кришкою, практично не змінюючи додаток. І складність реалізації потоку випливає саме з цього. Це набагато більше, ніж просто зручність, це правильне абстрагування. До ОП - пропоную прочитати « Майстерність лямбдасів» ... якщо ви хочете зрозуміти, чому лямбди та потоки - це набагато більше, ніж просто зручні функції.
Юрій Штайншрайбер

3
@InformedA: лямбдаси існують вже 80 років і існують майже у всіх сучасних мовах програмування. Потоки існують уже 40 років, і вони існують майже в усіх основних колекціях. Їх можна назвати різними речами (ітератори, ліниві списки, нумератори, перелічники), але вони є. Лямбдас і ліниві списки - одні з найдавніших і найстабільніших абстракцій, і вони пережили кожну нову примху, галасливість, парадигму, рух, методологію, технологію, мову, ОС, рамки, бібліотеку, кинуту на них. Це робить їх варто подивитися.
Йорг W Міттаг

2
@InformedA Java, мова програмування, - це просто безглузда абстракція байт-коду, що працює на JVM. Сам JVM - це просто абстракція, яка написана на С (або C ++, я забуваю). C і C ++ - це просто безглузді абстракції над мовою складання. Навіть сама мова монтажу - це абстракція на фігнях над мікрокодом, що також є абстракцією на фігнях над мікросхемами (добре, я можу пропустити кілька кроків між ними). Можна сказати, що все корисне в програмному забезпеченні - це "фігня-абстракція" над чимось іншим.
Андрес Ф.

3
@InformedA Моя чесна порада - ви намагаєтеся вивчити мову, більш орієнтовану на функціональне програмування, ніж Java. Навіть якщо ви ніколи не використовуєте його для своєї щоденної роботи, ви зрозумієте мови програмування та їх вибір дизайну, який допоможе вам Java :)
Андрес Ф.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.