पहला, वे सभी गैर-सख्त हैं । कार्यों से संबंधित एक विशेष गणितीय अर्थ है, लेकिन, मूल रूप से, इसका मतलब है कि वे अग्रिम की बजाय ऑन-डिमांड गणना कर रहे हैं।
Stream
वास्तव में एक आलसी सूची है। वास्तव में, स्काला में, एक Stream
a List
जिसका tail
a है lazy val
। एक बार गणना करने के बाद, एक मूल्य गणना की जाती है और पुन: उपयोग किया जाता है। या, जैसा कि आप कहते हैं, मानों को कैश किया गया है।
एक का Iterator
उपयोग केवल एक बार किया जा सकता है क्योंकि यह एक संग्रह में एक ट्रैवर्सल सूचक है , और अपने आप में संग्रह नहीं है। क्या यह स्काला में विशेष बनाता है तथ्य यह है कि आप इस तरह के रूप में परिवर्तन लागू कर सकते हैं map
और filter
और बस एक नया मिलता है Iterator
जो केवल इन परिवर्तनों लागू होगी जब आप अगले तत्व के लिए पूछना।
स्काला पुनरावृत्तियों को प्रदान करता था, जिसे रीसेट किया जा सकता था, लेकिन सामान्य तरीके से समर्थन करना बहुत कठिन है, और उन्होंने संस्करण 2.8.0 नहीं बनाया।
दृश्य को बहुत हद तक डेटाबेस दृश्य की तरह देखा जाता है। यह परिवर्तन की एक श्रृंखला है जो एक "आभासी" संग्रह का उत्पादन करने के लिए एक संग्रह पर लागू होती है। जैसा कि आपने कहा था, जब भी आपको इसमें से तत्वों को लाने की आवश्यकता होती है, तो सभी परिवर्तनों को फिर से लागू किया जाता है।
दोनों Iterator
और विचारों में उत्कृष्ट स्मृति विशेषताएं हैं। Stream
अच्छा है, लेकिन, स्काला में, इसका मुख्य लाभ अनंत अनुक्रम लिख रहा है (विशेष रूप से अनुक्रम पुनरावर्ती रूप से परिभाषित)। एक कर सकते हैं के सभी रखने से बचने Stream
सुनिश्चित करें कि आप अपने लिए एक संदर्भ नहीं रखते बनाकर हालांकि, स्मृति में, head
(उदाहरण के लिए, का उपयोग करके def
बजाय val
परिभाषित करने के लिए Stream
)।
विचारों द्वारा किए गए दंड के कारण, आमतौर पर force
इसे परिवर्तनों को लागू करने के बाद करना चाहिए , या इसे एक दृश्य के रूप में रखना चाहिए यदि केवल कुछ तत्वों को देखने के कुल आकार की तुलना में कभी भी प्राप्त होने की उम्मीद है।