Как сортировка с потоком Java 8 работает под капотом?

10

Когда я вызываю, Stream.sort(..)создается ли новый массив элементов, и поток перебирает вновь созданный отсортированный массив?

Другими словами, как работает Java 8 Stream sortпод капотом?

InformedA
источник
Почему я получил отрицательный голос с этим вопросом ???
InformedA
2
Ваш вопрос обоснован и не заслуживает отрицательных голосов. Ваши комментарии на ответ амона , однако ... тьфу: |
Андрес Ф.
@AndresF. Отказ от голосования пришел еще до того, как я сделал этот комментарий Это одна из причин, почему я был очень расстроен.
InformedA
В любом случае, комментарии не являются причиной понижения. Вопрос стоит сам по себе, и, на мой взгляд, он действителен. Я проголосовал за это.
Андрес Ф.

Ответы:

10

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

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

Конечно, такие подробности реализации могут меняться с любым выпуском, но фундаментальные соображения универсальны: сортировка потока обязательно является операцией нетерпеливого / блокирующего, а сортировка бесконечного потока не имеет смысла. Это означает, что сортировка потока бесполезна, если вы используете потоки, потому что они могут быть ленивыми, но вы все равно получаете удобный синтаксис потока.

Другие потоки должны будут обеспечить собственную реализацию Stream.sorted(), которая, вероятно, будет аналогичной.

Амон
источник
1
@InformedA Я не хочу предположить, что лямбды или потоки были бы "ерундой под капотом". Они оба невероятно удобны, хотя детали относительно потоков необычно сложны по сравнению с другими концепциями Java. Если вы хотите придерживаться своего предвзятого мнения, что эти инструменты бесполезны или вредны, вы излишне ограничиваете себя.
Амон
1
@amon - согласен, плюс потоки предоставляют возможность развернуть многоядерные параллельные реализации под капотом, практически не меняя приложения. И сложность реализации потока происходит именно от этого. Это гораздо больше, чем просто удобство, это правильная абстракция. Для OP - я предлагаю вам прочитать Mastering Lambdas ... если вы хотите понять, почему лямбды и потоки - это гораздо больше, чем просто удобные функции.
Юрий Штайншрайбер
3
@InformedA: лямбды существуют уже 80 лет и существуют практически во всех современных языках программирования. Потоки существуют уже 40 лет, и также существуют практически во всех основных коллекциях. Их можно называть разными вещами (итераторы, ленивые списки, перечислители, перечислимые), но они есть. Лямбда и ленивые списки являются одними из самых старых и стабильных абстракций, которые существуют, и они пережили каждую новую причуду, шумиху, парадигму, движение, методологию, технологию, язык, ОС, структуру, библиотеку, брошенную на них. Это делает их достойными внимания.
Йорг Миттаг
2
@InformedA Java, язык программирования, это просто чушь абстракции байт-кода, работающего на JVM. Сама JVM - это просто чушь, написанная на C (или C ++, я забыл). C и C ++ - просто чушь абстракции над языком ассемблера. Даже сам язык ассемблера - это чушь абстракции над микрокодом, которая также является чушью абстракции над схемами (хорошо, я мог бы пропустить несколько промежуточных шагов). Вы можете сказать, что все полезное в программном обеспечении - это «чушь собачья» над чем-то другим.
Андрес Ф.
3
@InformedA Мой честный совет - старайтесь изучать язык, более ориентированный на функциональное программирование, чем на Java. Даже если вы никогда не используете его для своей повседневной работы, вы получите представление о языках программирования и их выборе дизайна, которые помогут вам с Java :)
Andres F.