Anda mengajukan pertanyaan yang salah. Anda bertanya tentang sequential
vs. parallel
sedangkan Anda ingin memproses item dalam urutan , jadi Anda harus bertanya tentang pemesanan . Jika Anda memiliki aliran yang dipesan dan melakukan operasi yang menjamin untuk mempertahankan pesanan, tidak masalah apakah aliran diproses secara paralel atau berurutan; implementasi akan mempertahankan pesanan.
Properti yang dipesan berbeda dari paralel vs berurutan. Misalnya jika Anda menelepon stream()
pada HashSet
sungai akan unordered sambil menelepon stream()
pada List
pengembalian aliran memerintahkan. Perhatikan bahwa Anda dapat menelepon unordered()
untuk melepaskan kontrak pemesanan dan berpotensi meningkatkan kinerja. Setelah aliran tidak memiliki pemesanan, tidak ada cara untuk membangun kembali pemesanan. (Satu-satunya cara untuk mengubah aliran yang tidak berurutan menjadi yang dipesan adalah dengan menelepon sorted
, namun, pesanan yang dihasilkan belum tentu urutan asli).
Lihat juga bagian "Memesan" dari java.util.stream
dokumentasi paket .
Untuk memastikan pemeliharaan pemesanan di seluruh operasi aliran, Anda harus mempelajari dokumentasi sumber aliran, semua operasi menengah dan operasi terminal untuk apakah mereka mempertahankan pesanan atau tidak (atau apakah sumber memiliki pemesanan di urutan pertama). tempat).
Ini bisa sangat halus, misalnya Stream.iterate(T,UnaryOperator)
membuat aliran yang diurutkan sementara Stream.generate(Supplier)
membuat aliran yang tidak terurut . Perhatikan bahwa Anda juga membuat kesalahan umum dalam pertanyaan Anda karena tidak mempertahankan pemesanan. Anda harus menggunakan jika Anda ingin memproses elemen aliran dalam urutan yang terjamin.forEach
forEachOrdered
Jadi jika list
pertanyaan Anda adalah a java.util.List
, stream()
metodenya akan mengembalikan aliran yang dipesan dan filter
tidak akan mengubah pemesanan. Jadi jika Anda memanggil list.stream().filter() .forEachOrdered()
, semua elemen akan diproses secara berurutan, sedangkan untuk list.parallelStream().filter().forEachOrdered()
elemen mungkin diproses secara paralel (misalnya dengan filter) tetapi tindakan terminal masih akan dipanggil secara berurutan (yang jelas akan mengurangi manfaat dari eksekusi paralel) .
Jika Anda, misalnya, gunakan operasi seperti
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
seluruh operasi mungkin mendapat manfaat dari eksekusi paralel tetapi daftar yang dihasilkan akan selalu dalam urutan yang benar, terlepas dari apakah Anda menggunakan aliran paralel atau berurutan.
List<>
akan mempertahankan pesanan, tetapi akankahCollection<>
?Set
Biasanya tidak, kecuali itu adalahSortedSet
atauLinkedHashSet
. Pandangan koleksi dariMap
(keySet()
,,entrySet()
danvalues()
) mewarisiMap
kebijakan, yaitu dipesan ketika peta adalahSortedMap
atauLinkedHashMap
. Perilaku ditentukan oleh karakteristik yang dilaporkan oleh spliterator koleksi . Thedefault
pelaksanaanCollection
tidak melaporkanORDERED
karakteristik, sehingga unordered, kecuali ditimpa.forEachOrdered
hanya berbedaforEach
ketika menggunakan aliran paralel - tetapi praktik yang baik untuk tetap menggunakannya saat memesan masalah jika metode pengukusan berubah ...Pendeknya:
Pemesanan tergantung pada struktur data sumber dan operasi aliran perantara. Dengan asumsi Anda menggunakan
List
pemrosesan harus dipesan (karenafilter
tidak akan mengubah urutan di sini).Keterangan lebih lanjut:
Sequential vs Parallel vs Unordered:
Javadocs
Pengurutan Aliran:
Javadocs
sumber