Saya memahami bahwa metode ini membedakan urutan eksekusi tetapi dalam semua pengujian saya, saya tidak dapat mencapai eksekusi pesanan yang berbeda.
Contoh:
System.out.println("forEach Demo");
Stream.of("AAA","BBB","CCC").forEach(s->System.out.println("Output:"+s));
System.out.println("forEachOrdered Demo");
Stream.of("AAA","BBB","CCC").forEachOrdered(s->System.out.println("Output:"+s));
Keluaran:
forEach Demo
Output:AAA
Output:BBB
Output:CCC
forEachOrdered Demo
Output:AAA
Output:BBB
Output:CCC
Berikan contoh ketika 2 metode akan menghasilkan keluaran yang berbeda.
java
foreach
java-8
java-stream
gstackoverflow
sumber
sumber
Jawaban:
Stream.of("AAA","BBB","CCC").parallel().forEach(s->System.out.println("Output:"+s)); Stream.of("AAA","BBB","CCC").parallel().forEachOrdered(s->System.out.println("Output:"+s));
Baris kedua akan selalu keluar
sedangkan yang pertama tidak dijamin karena pesanan tidak disimpan.
forEachOrdered
akan memproses elemen aliran dalam urutan yang ditentukan oleh sumbernya, terlepas dari apakah aliran tersebut berurutan atau paralel.Mengutip dari
forEach
Javadoc:Ketika
forEachOrdered
Javadoc menyatakan (penekanan saya):sumber
forEachOrdered
denganparallel
?Meskipun
forEach
lebih pendek dan terlihat lebih cantik, saya sarankan untuk menggunakanforEachOrdered
di setiap tempat di mana urutan penting untuk menentukan ini secara eksplisit. Untuk aliran sekuensial,forEach
tampaknya menghormati urutan dan bahkan menggunakan kode internal API streamingforEach
(untuk aliran yang dikenal berurutan) di mana itu secara semantik perlu digunakanforEachOrdered
! Namun demikian, Anda nantinya dapat memutuskan untuk mengubah aliran Anda menjadi paralel dan kode Anda akan rusak. Juga ketika Anda menggunakanforEachOrdered
pembaca kode Anda melihat pesan: "urutan penting di sini". Dengan demikian, ini mendokumentasikan kode Anda dengan lebih baik.Perhatikan juga bahwa untuk aliran paralel,
forEach
tidak hanya dijalankan dalam urutan non-determenistik, tetapi Anda juga dapat menjalankannya secara bersamaan di utas yang berbeda untuk elemen yang berbeda (yang tidak dimungkinkan denganforEachOrdered
).Akhirnya keduanya
forEach
/forEachOrdered
jarang berguna. Dalam kebanyakan kasus, Anda benar-benar perlu menghasilkan beberapa hasil, bukan hanya efek samping, sehingga operasi sepertireduce
ataucollect
seharusnya lebih sesuai. Mengekspresikan operasi pengurangan sifat melaluiforEach
biasanya dianggap sebagai gaya yang buruk.sumber
forEachOrdered
dalam kode itu?flatMap
). Itu dapat dipesan, sehingga harus ditempatkan ke aliran yang dihasilkan dalam urutan yang sama.Stream.of("a", "b", "c").flatMap(s -> Stream.of("1", "2", "3").map(s::concat)).spliterator().hasCharacteristics(Spliterator.ORDERED)
mengembalikan nilai true, sehingga urutan aliran yang dihasilkan harus ditentukan. Jika Anda merasa bahwa dokumentasi JDK harus secara eksplisit menyatakan hal ini, silakan kirimkan bug.forEach()
metode melakukan tindakan untuk setiap elemen aliran ini. Untuk aliran paralel, operasi ini tidak menjamin untuk menjaga ketertiban aliran.forEachOrdered()
metode melakukan tindakan untuk setiap elemen aliran ini, menjamin bahwa setiap elemen diproses dalam urutan pertemuan untuk aliran yang memiliki urutan pertemuan yang ditentukan.ambil contoh di bawah ini:
String str = "sushil mittal"; System.out.println("****forEach without using parallel****"); str.chars().forEach(s -> System.out.print((char) s)); System.out.println("\n****forEach with using parallel****"); str.chars().parallel().forEach(s -> System.out.print((char) s)); System.out.println("\n****forEachOrdered with using parallel****"); str.chars().parallel().forEachOrdered(s -> System.out.print((char) s));
Keluaran:
sumber