गैर-समवर्ती डेटा संरचना स्रोतों की धाराओं का उपयोग करने के लिए गैर हस्तक्षेप की आवश्यकता का मतलब है कि हम निष्पादन के दौरान डेटा संरचना के तत्व की स्थिति को नहीं बदल सकते हैं एक स्ट्रीम पाइपलाइन (इसके अतिरिक्त हम स्रोत डेटा संरचना को भी बदल नहीं सकते हैं)? (प्रश्न 1)जावा 8 धाराओं में गैर हस्तक्षेप सटीक अर्थ
अनुभाग के बारे में non-interference में, धारा पैकेज विवरण में, अपने ने कहा: "सबसे डेटा स्रोतों के लिए, हस्तक्षेप को रोकने सुनिश्चित करना है कि डेटा स्रोत के निष्पादन के दौरान सभी पर संशोधित नहीं है इसका मतलब है स्ट्रीम पाइपलाइन। "
इस मार्ग में तत्वों की स्थिति को संशोधित करने का उल्लेख नहीं है?
उदाहरण के लिए, "आकार" मानना गैर थ्रेड-सुरक्षित संग्रह (जैसे ArrayList
) है, क्या नीचे दिए गए कोड में हस्तक्षेप माना जाता है? (कम से कम कहने के लिए) (प्रश्न 2)
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.forEach(s -> s.setColor(RED));
यह उदाहरण एक reliable source से लिया जाता है, तो यह सही होना चाहिए। लेकिन अगर मैंने stream()
को parallelStream()
पर बदल दिया है, तो क्या यह अभी भी सुरक्षित और सही होगा? (प्रश्न 3)
दूसरी तरफ, नाफ्टलिन मॉरीस द्वारा "मास्टरिंग लैम्बडास", एक और विश्वसनीय स्रोत, यह स्पष्ट करता है कि पाइपलाइन ऑपरेशन द्वारा तत्वों के राज्य (मूल्य) को वास्तव में हस्तक्षेप करना बदलता है। गैर-हस्तक्षेप के बारे में अनुभाग से (3.2.3):
"लेकिन धाराओं के नियम धारा स्रोतों के किसी भी संशोधन को रोकते हैं, उदाहरण के लिए, तत्व के मूल्य को बदलना- किसी भी थ्रेड द्वारा, न केवल पाइपलाइन संचालन । "
यदि पुस्तक में जो कहा गया है वह सही है, तो इसका मतलब यह है कि हम तत्वों की स्थिति को संशोधित करने के लिए स्ट्रीम एपीआई का उपयोग नहीं कर सकते हैं (forEach
का उपयोग करके), और इसे नियमित इटरेटर (या प्रत्येक के लिए, या Iterable.forEach
)? (प्रश्न 4)
दूसरे शब्दों में, "हस्तक्षेप" उच्च स्तर पर रहता है। एक धारा तत्व को संशोधित करने में एक क्रिया हस्तक्षेप कर सकती है, जब यह समान तत्व को एक साथ संशोधित कर रही है, लेकिन यह तब नहीं होती जब यह अलग-अलग वस्तुओं को संशोधित कर रही हो। इसी तरह, एक 'ऐरेलिस्ट' अपने आप में धागा सुरक्षित नहीं है, एक समवर्ती परिदृश्य में 'ऐरेलिस्ट का सही ढंग से उपयोग की संभावना को रोकता नहीं है। यह सब कुछ है, * कैसे * इसका उपयोग किया जाता है ... – Holger
आपके स्पष्ट और विस्तृत उत्तर के लिए धन्यवाद टैगिर। संग्रह में संशोधित तत्वों को बनाए रखना आम कार्य है, और इटरेटर का उपयोग करके किए गए संग्रहों पर कई संचालन - तत्वों को बदलने की जरूरत है, इसलिए यह वास्तव में मुझे परेशान करता है। यदि हम सुरक्षित रूप से ऐसा नहीं कर पा रहे थे (कम से कम समांतर धाराओं के मामले में) तो यह धाराओं को बहुत कम उपयोगी बना देता। – Shay
टैगिर, ध्यान दें कि राज्यव्यापी लैम्ब्डा को स्ट्रीम पैकेज में परिभाषित किया गया है (और आपके द्वारा उल्लिखित लिंक में) "जिसका परिणाम किसी भी राज्य पर निर्भर करता है जो स्ट्रीम पाइपलाइन के निष्पादन के दौरान बदल सकता है"। – Shay