स्ट्रीम
जावा 8 से पहले
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
जावा 8
हम लैम्ब्डा और स्ट्रीम का उपयोग भी कर सकते हैं ( ट्यूटोरियल ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
धाराओं के साथ क्यों forEachOrdered
और कैसे नहीं forEach
?
यदि इस धारा के प्रत्येक तत्व के लिए एक क्रिया करता है, तो धारा का एनकाउंटर क्रम में यदि एनकाउंटर एनकाउंटर ऑर्डर है, तो forEach
स्पष्ट रूप से नॉनडेर्मिनिस्टिक का व्यवहार होता है forEachOrdered
। इसलिए forEach
गारंटी नहीं देता कि ऑर्डर रखा जाएगा।
धाराओं के साथ काम करते समय (विशेष रूप से समानांतर वाले) धाराओं की प्रकृति को ध्यान में रखें। डॉक्टर के अनुसार :
स्ट्रीम पाइपलाइन के परिणाम nondeterministic या गलत हो सकते हैं यदि धारा संचालन के लिए व्यवहारिक पैरामीटर स्टेटफुल हैं। स्टेटफुल लैम्बडा वह है जिसका परिणाम किसी भी राज्य पर निर्भर करता है जो स्ट्रीम पाइपलाइन के निष्पादन के दौरान बदल सकता है।
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
यहां, यदि मैपिंग ऑपरेशन समानांतर में किया जाता है, तो एक ही इनपुट के परिणाम थ्रेड शेड्यूलिंग अंतर के कारण, रन-रन से भिन्न हो सकते हैं, जबकि, एक स्टेटलेस लैम्ब्डा अभिव्यक्ति के साथ परिणाम हमेशा समान होंगे।
व्यवहार के मापदंडों में साइड-इफेक्ट ऑपरेशन को स्ट्रीम करने के लिए, सामान्य रूप से, हतोत्साहित होते हैं, क्योंकि वे अक्सर स्टेटलेसनेस आवश्यकता के अनजाने उल्लंघन के साथ-साथ अन्य थ्रेड-सुरक्षा खतरों का कारण बन सकते हैं।
धाराएँ एक परिभाषित मुठभेड़ आदेश हो सकती हैं या नहीं। एक स्ट्रीम के पास एनकाउंटर ऑर्डर है या नहीं, यह स्रोत और मध्यवर्ती संचालन पर निर्भर करता है।