चर्चा के लिए मुझे अपना उदाहरण थोड़ा सुधारना चाहिए:
long runCount = 0L;
myStream.stream()
.filter(...)
.forEach(item -> {
foo();
bar();
runCount++;
});
System.out.println("The lambda ran " + runCount + " times");
यदि आपको वास्तव में एक लैम्ब्डा के भीतर से एक काउंटर को बढ़ाने की आवश्यकता है, तो ऐसा करने का विशिष्ट तरीका काउंटर को AtomicIntegerया AtomicLongतो बनाना है और फिर उस पर वेतन वृद्धि विधियों में से एक को कॉल करना है।
आप एकल-तत्व intया longसरणी का उपयोग कर सकते हैं , लेकिन यदि धारा समानांतर रूप से चलती है, तो दौड़ की स्थिति होगी।
लेकिन ध्यान दें कि स्ट्रीम में समाप्त होता है forEach, जिसका अर्थ है कि कोई वापसी मूल्य नहीं है। आप को बदल सकता है forEachएक करने के लिए peek, जिसके माध्यम से आइटम गुजरता है, और फिर उन्हें गिनती:
long runCount = myStream.stream()
.filter(...)
.peek(item -> {
foo();
bar();
})
.count();
System.out.println("The lambda ran " + runCount + " times");
यह कुछ हद तक बेहतर है, लेकिन फिर भी थोड़ा अजीब है। कारण यह है कि है forEachऔर peekकेवल दुष्प्रभाव के माध्यम से अपने काम कर सकते हैं। जावा 8 की उभरती कार्यात्मक शैली दुष्प्रभावों से बचने के लिए है। हमने countधारा पर एक ऑपरेशन में काउंटर के वेतन वृद्धि को हटाकर थोड़ा सा किया । अन्य विशिष्ट दुष्प्रभाव संग्रह में आइटम जोड़ रहे हैं। आमतौर पर इन्हें संग्राहकों के उपयोग से बदला जा सकता है। लेकिन यह जानने के बिना कि आप किस वास्तविक काम को करने की कोशिश कर रहे हैं, मैं और अधिक विशिष्ट सुझाव नहीं दे सकता।