Tartışma uğruna örneğinizi biraz yeniden biçimlendirmeme izin verin:
long runCount = 0L;
myStream.stream()
.filter(...)
.forEach(item -> {
foo();
bar();
runCount++;
});
System.out.println("The lambda ran " + runCount + " times");
Eğer varsa gerçekten bir lambda içinden bir sayacını artırmak gerekir, bunu yapmak için tipik bir yol sayacı bir hale getirmektir AtomicInteger
veya AtomicLong
sonra üzerine artım yöntemlerinden birini arayın.
Tek öğe int
veya long
dizi kullanabilirsiniz, ancak akış paralel olarak çalıştırılırsa bu, yarış koşullarına sahip olacaktır.
Ancak akışın sona erdiğine dikkat edin forEach
, bu da dönüş değeri olmadığı anlamına gelir. Öğeleri geçiren forEach
a olarak değiştirebilir peek
ve ardından bunları sayabilirsiniz:
long runCount = myStream.stream()
.filter(...)
.peek(item -> {
foo();
bar();
})
.count();
System.out.println("The lambda ran " + runCount + " times");
Bu biraz daha iyi, ama yine de biraz tuhaf. Nedeni şudur forEach
ve peek
işlerini yalnızca yan etkiler yoluyla yapabilir. Java 8'in ortaya çıkan işlevsel stili, yan etkilerden kaçınmaktır. Sayaç artışını count
akış üzerinde bir işleme çıkararak biraz yaptık . Diğer tipik yan etkiler koleksiyonlara ürün eklemektir. Genellikle bunlar kollektörler kullanılarak değiştirilebilir. Ama ne tür fiili işi yapmaya çalıştığınızı bilmeden daha spesifik bir şey öneremem.