इस बात पर विचार करें List<String> stringList
कि जावा 8 निर्माणों का उपयोग करके कई तरीकों से किसे मुद्रित किया जा सकता है :
stringList.forEach(System.out::println); // 1) Iterable.forEach
stringList.stream().forEach(System.out::println); // 2) Stream.forEach (order maintained generally but doc does not guarantee)
stringList.stream().forEachOrdered(System.out::println); // 3) Stream.forEachOrdered (order maintained always)
stringList.parallelStream().forEach(System.out::println); // 4) Parallel version of Stream.forEach (order not maintained)
stringList.parallelStream().forEachOrdered(System.out::println); // 5) Parallel version ofStream.forEachOrdered (order maintained always)
ये दृष्टिकोण एक दूसरे से अलग कैसे हैं?
पहला दृष्टिकोण ( Iterable.forEach
) -
संग्रह के इटेरेटर का उपयोग आम तौर पर किया जाता है और जिसे विफल-तेज़ बनाया गया है, जिसका अर्थ है कि ConcurrentModificationException
अगर यह संग्रह के दौरान अंतर्निहित संग्रह संरचनात्मक रूप से संशोधित किया गया है तो इसे फेंक देगा । के लिए डॉक्टर के रूप में उल्लेख किया गया है ArrayList
:
एक संरचनात्मक संशोधन कोई भी ऑपरेशन है जो एक या अधिक तत्वों को जोड़ता या हटाता है, या बैकिंग सरणी को स्पष्ट रूप से आकार देता है; केवल एक तत्व का मूल्य निर्धारित करना एक संरचनात्मक संशोधन नहीं है।
तो इसका मतलब है कि ArrayList.forEach
किसी भी मुद्दे के बिना मूल्य निर्धारित करने की अनुमति है। और समवर्ती संग्रह के मामले में उदाहरण के ConcurrentLinkedQueue
लिए इट्रेटर कमजोर-सुसंगत होगा जिसका अर्थ है कि पारित किए गए कार्यों forEach
को ConcurrentModificationException
अपवाद के बिना संरचनात्मक परिवर्तन करने की अनुमति है । लेकिन यहां संशोधन उस पुनरावृत्ति में दिखाई नहीं दे सकते हैं या हो सकते हैं।
दूसरा दृष्टिकोण ( Stream.forEach
) -
आदेश अपरिभाषित है। यह क्रमिक धाराओं के लिए नहीं हो सकता है, लेकिन विनिर्देश इसकी गारंटी नहीं देता है। इसके अलावा कार्रवाई प्रकृति में गैर-हस्तक्षेप करने के लिए आवश्यक है। जैसा कि डॉक्टर ने उल्लेख किया है :
इस ऑपरेशन का व्यवहार स्पष्ट रूप से नॉनडेटर्मिनिस्टिक है। समानांतर स्ट्रीम पाइपलाइनों के लिए, यह ऑपरेशन स्ट्रीम के एनकाउंटर ऑर्डर का सम्मान करने की गारंटी नहीं देता है, क्योंकि ऐसा करने से समानता का लाभ मिलता है।
तीसरा दृष्टिकोण ( Stream.forEachOrdered
) -
कार्रवाई धारा के मुठभेड़ क्रम में की जाएगी। इसलिए जब भी आदेश के मामले forEachOrdered
एक दूसरे विचार के बिना उपयोग करते हैं । जैसा कि डॉक्टर ने उल्लेख किया है :
इस धारा के प्रत्येक तत्व के लिए एक कार्रवाई करता है, तो धारा के मुठभेड़ क्रम में यदि धारा में एक मुठभेड़ आदेश है।
एक से अधिक पुनरावृत्ति जबकि सिंक्रनाइज़ संग्रह पहले दृष्टिकोण संग्रह की लॉक ले जाएगा एक बार और कॉल कार्रवाई विधि करने के लिए है, लेकिन नदियों के मामले में वे संग्रह के spliterator, जो लॉक नहीं करता है और गैर की पहले से ही स्थापित नियमों पर निर्भर करता है का उपयोग करें, वे इसे पूरे पकड़ होगा -दखल अंदाजी। मामले के संग्रह में धारा का समर्थन करते हुए पुनरावृत्ति के दौरान संशोधित किया जाता है ConcurrentModificationException
या फेंका जाएगा या असंगत परिणाम हो सकता है।
चौथा दृष्टिकोण (समानांतर Stream.forEach
) -
जैसा कि पहले ही उल्लेख किया गया है कि समानांतर धाराओं के मामले में मुठभेड़ आदेश का सम्मान करने की कोई गारंटी नहीं है। यह संभव है कि विभिन्न तत्वों के लिए विभिन्न थ्रेड में कार्रवाई की जाती है जो कभी भी ऐसा नहीं हो सकता है forEachOrdered
।
पांचवें दृष्टिकोण (समानांतर Stream.forEachOrdered
) -forEachOrdered
स्रोत तथ्य के बावजूद द्वारा निर्दिष्ट क्रम में तत्वों पर कार्रवाई करेंगे कि क्या धारा अनुक्रमिक या समानांतर है। तो यह समानांतर धाराओं के साथ इसका उपयोग करने के लिए कोई मतलब नहीं है।
List
? हमें बताएं कि आपने इसे कैसे घोषित किया और इसे तुरंत बदल दिया।