Bagaimana cara menyortir dengan java 8 stream berfungsi di bawah tenda?

10

Ketika saya menelepon, Stream.sort(..)adakah array elemen baru yang dibuat dan alirannya berputar di atas array yang diurutkan yang baru dibuat?

Dengan kata lain, bagaimana Java 8 Stream berfungsi di sortbawah tenda?

InformedA
sumber
Mengapa saya mendapat suara turun dengan pertanyaan ini ???
InformedA
2
Pertanyaan Anda masuk akal dan tidak layak untuk downvotes. Namun, komentar Anda tentang jawaban Amon ... ugh: |
Andres F.
@AndresF. Suara turun datang bahkan sebelum saya membuat komentar itu. Itu adalah salah satu alasan mengapa saya sangat kesal.
InformedA
Komentar itu bukan alasan untuk menurunkan suara. Pertanyaan itu berdiri pada kemampuannya sendiri, dan itu sah menurut pendapat saya. Saya membatalkannya.
Andres F.

Jawaban:

10

Anda dapat menggunakan grepcode.com untuk mencari melalui kode perpustakaan standar Java (dan beberapa perpustakaan lainnya). Sayangnya, kode implementasi aliran agak abstrak. Titik awal yang baik adalah java.util.stream.SortedOpskelas internal yang mengubah aliran menjadi aliran yang diurutkan.

The saat pelaksanaan (digunakan untuk aliran wadah perpustakaan standar) membuat no-op jika sungai sudah diurutkan, menggunakan sebuah array jika ukuran sungai diketahui ( SizedRefSortingSink), atau terakumulasi semua elemen dalam sebuah ArrayList jika ukurannya tidak diketahui ( RefSortingSink).

Tentu saja, detail implementasi seperti itu dapat berubah dengan rilis apa pun, tetapi pertimbangan mendasarnya bersifat universal: Menyortir aliran tentu saja merupakan operasi yang bersemangat / memblokir, dan menyortir aliran tak terbatas tidak bermakna. Ini berarti menyortir aliran tidak berguna jika Anda menggunakan aliran karena mereka bisa malas, tetapi Anda masih mendapatkan sintaksis aliran yang nyaman.

Streaming lain harus menyediakan implementasi mereka sendiri Stream.sorted(), yang kemungkinan akan serupa.

amon
sumber
1
@InformedA Saya tidak ingin menyarankan bahwa lambdas atau stream akan menjadi "omong kosong di bawah tenda". Keduanya sangat nyaman, meskipun detail mengenai stream sangat kompleks dibandingkan dengan konsep Java lainnya. Jika Anda ingin tetap berpegang pada anggapan bahwa alat-alat ini tidak berguna atau berbahaya, Anda tidak perlu membatasi diri.
amon
1
@amon - setuju, plus stream memberikan kemungkinan untuk menggulirkan implementasi paralel multicore di bawah tenda, tanpa mengubah aplikasi secara virtual. Dan kerumitan implementasi aliran datang persis dari itu. Itu jauh lebih dari sekadar kenyamanan, itu abstraksi yang tepat. Untuk OP - Saya sarankan Anda membaca Menguasai Lambdas ... jika Anda ingin memahami mengapa lambdas dan stream jauh lebih banyak daripada fitur yang mudah.
Yuri Steinschreiber
3
@InformedA: lambdas telah ada selama 80 tahun dan ada di hampir setiap bahasa pemrograman arus utama. Streaming telah ada selama 40 tahun, dan juga ada di hampir setiap kerangka koleksi arus utama. Mereka mungkin disebut hal-hal yang berbeda (iterator, daftar malas, enumerator, enumerable), tetapi mereka ada di sana. Lambdas dan daftar malas adalah beberapa abstraksi tertua dan paling stabil yang ada, dan mereka telah bertahan setiap mode, sensasi, paradigma, gerakan, metodologi, teknologi, bahasa, OS, kerangka kerja, perpustakaan yang dilemparkan kepada mereka. Itu membuat mereka layak untuk dilihat.
Jörg W Mittag
2
@InformedA Java, bahasa pemrograman, hanyalah abstraksi omong kosong dari bytecode yang berjalan di JVM. JVM itu sendiri hanyalah abstraksi omong kosong yang ditulis dalam C (atau C ++, saya lupa). C dan C ++ hanyalah abstraksi omong kosong atas bahasa assembly. Bahkan bahasa assembly itu sendiri adalah abstraksi omong kosong atas mikrokode, yang juga merupakan abstraksi omong kosong atas sirkuit (ok, saya mungkin kehilangan beberapa langkah di antaranya). Bisa dibilang semua yang berguna dalam perangkat lunak adalah "abstraksi omong kosong" atas sesuatu yang lain.
Andres F.
3
@InformedA Nasihat jujur ​​saya adalah agar Anda mencoba mempelajari bahasa yang lebih berorientasi pada pemrograman fungsional daripada Java. Bahkan jika Anda tidak pernah menggunakannya untuk pekerjaan harian Anda, Anda akan mendapatkan pemahaman tentang bahasa pemrograman dan pilihan desain mereka yang akan membantu Anda dengan Java :)
Andres F.