Streaming
Sebelum ke Jawa 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Kami juga dapat menggunakan lambda dan stream ( Tutorial ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Kenapa forEachOrdered
dan tidakforEach
dengan stream?
Perilaku forEach
eksplisit nondeterministik di mana sebagai forEachOrdered
melakukan tindakan untuk setiap elemen aliran ini, dalam urutan pertemuan aliran jika aliran memiliki urutan pertemuan yang ditentukan. Jadi forEach
tidak menjamin bahwa pesanan akan disimpan.
Juga ketika bekerja dengan stream (terutama yang paralel) perlu diingat sifat stream. Sesuai dokumen :
Hasil aliran pipa mungkin tidak deterministik atau salah jika parameter perilaku ke operasi aliran stateful. Lambda stateful adalah salah satu yang hasilnya tergantung pada negara yang mungkin berubah selama pelaksanaan pipa aliran.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Di sini, jika operasi pemetaan dilakukan secara paralel, hasil untuk input yang sama dapat bervariasi dari satu menjalankan ke menjalankan, karena perbedaan penjadwalan thread, sedangkan, dengan ekspresi lambda stateless, hasilnya akan selalu sama.
Efek samping dalam parameter perilaku untuk mengalirkan operasi, secara umum, tidak disarankan, karena seringkali dapat menyebabkan pelanggaran tanpa disadari terhadap persyaratan kewarganegaraan, serta bahaya keselamatan benang lainnya.
Streaming mungkin atau mungkin tidak memiliki urutan pertemuan yang ditentukan. Apakah aliran memiliki urutan pertemuan atau tidak tergantung pada sumber dan operasi perantara.