Saya mengalami kesulitan memahami Stream
antarmuka di Java 8, terutama yang berkaitan dengan Spliterator
dan Collector
antarmuka. Masalah saya adalah bahwa saya tidak bisa mengerti Spliterator
dan Collector
antarmuka belum, dan sebagai hasilnya, Stream
antarmuka masih agak tidak jelas bagi saya.
Apa itu a Spliterator
dan a Collector
, dan bagaimana saya bisa menggunakannya? Jika saya mau menulis sendiri Spliterator
atau Collector
(dan mungkin saya sendiri Stream
dalam proses itu), apa yang harus saya lakukan dan tidak lakukan?
Saya membaca beberapa contoh yang tersebar di web, tetapi karena semuanya di sini masih baru dan dapat berubah, contoh dan tutorialnya masih sangat jarang.
sumber
Collectors.of
metode lama versi beta sudah dihapus atau saya-saya kehilangan sesuatu? Untuk kelengkapan,(x,y) -> x+y
bisa ditulis sebagaiInteger::sum
.Spliterator
pada dasarnya berarti "splitterable Iterator".Single thread dapat melintasi / memproses seluruh Spliterator itu sendiri, tetapi Spliterator juga memiliki metode
trySplit()
yang akan "memisahkan" bagian untuk diproses oleh orang lain (biasanya, utas lainnya) - meninggalkan spliterator saat ini dengan lebih sedikit pekerjaan.Collector
menggabungkan spesifikasireduce
fungsi (ketenaran peta-pereduksi), dengan nilai awal, dan fungsi untuk menggabungkan dua hasil (sehingga memungkinkan hasil dari aliran pekerjaan yang terpisah, untuk digabungkan.)Misalnya, Kolektor paling dasar akan memiliki vaue awal 0, menambahkan bilangan bulat ke hasil yang ada, dan akan 'menggabungkan' dua hasil dengan menambahkannya. Dengan demikian menjumlahkan aliran bilangan bulat yang terpecah.
Lihat:
Spliterator.trySplit()
Collector<T,A,R>
sumber
Berikut ini adalah contoh penggunaan kolektor yang telah ditentukan sebelumnya untuk melakukan tugas reduksi yang umum bisa berubah:
sumber
Antarmuka
Spliterator
- adalah fitur inti dari Streaming .Metode
stream()
danparallelStream()
standar disajikan dalamCollection
antarmuka. Metode-metode ini menggunakan Spliterator melalui panggilan kespliterator()
:Spliterator adalah iterator internal yang memecah aliran menjadi bagian-bagian yang lebih kecil. Bagian-bagian yang lebih kecil ini dapat diproses secara paralel.
Di antara metode lain, ada dua yang paling penting untuk memahami Spliterator:
boolean tryAdvance(Consumer<? super T> action)
Berbeda denganIterator
itu, ia mencoba melakukan operasi dengan elemen berikutnya. Jika operasi berhasil dilakukan, metode kembalitrue
. Jika tidak, mengembalikanfalse
- itu berarti bahwa tidak ada elemen atau ujung aliran.Spliterator<T> trySplit()
Metode ini memungkinkan untuk membagi satu set data menjadi banyak set yang lebih kecil sesuai dengan satu atau kriteria lain (ukuran file, jumlah baris, dll).sumber