चर्चा के लिए मुझे अपना उदाहरण थोड़ा सुधारना चाहिए:
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
धारा पर एक ऑपरेशन में काउंटर के वेतन वृद्धि को हटाकर थोड़ा सा किया । अन्य विशिष्ट दुष्प्रभाव संग्रह में आइटम जोड़ रहे हैं। आमतौर पर इन्हें संग्राहकों के उपयोग से बदला जा सकता है। लेकिन यह जानने के बिना कि आप किस वास्तविक काम को करने की कोशिश कर रहे हैं, मैं और अधिक विशिष्ट सुझाव नहीं दे सकता।