2015-04-22 16 views
5

मैं जावा 8 स्ट्रीम पर डेटा पढ़ रहा हूं और डेटा संग्रह से डेटा को स्ट्रीम करने के बजाय डेटा संग्रह से डेटा स्ट्रीम किया गया है।जावा 8 स्ट्रीम बनाम संग्रह संग्रहण

विशेष रूप से यह बोली मैं जावा 8.

में धाराओं के बारे में एक लेख पर पढ़ा "नहीं भंडारण स्ट्रीम मूल्यों के लिए भंडारण की जरूरत नहीं है;। वे (एक स्रोत से मान ले जो डेटा संरचना हो सकता है, एक उत्पन्न कार्य, एक आई/ओ चैनल, आदि) कम्प्यूटेशनल चरणों की एक पाइपलाइन के माध्यम से। " स्रोत से: http://www.drdobbs.com/jvm/lambdas-and-streams-in-java-8-libraries/240166818?pgno=1

मैं टुकड़ा द्वारा एक स्रोत के टुकड़े से में डेटा स्ट्रीमिंग की अवधारणा को समझने। जो मुझे समझ में नहीं आता है वह यह है कि यदि आप संग्रह से स्ट्रीमिंग कर रहे हैं तो कोई भंडारण नहीं है? संग्रह ढेर पर पहले से मौजूद है, आप बस उस संग्रह से डेटा स्ट्रीम कर रहे हैं, संग्रह "भंडारण" में पहले से मौजूद है।

अगर मैं लूप के लिए मानक के साथ संग्रह के माध्यम से बस लूप करना चाहता हूं तो स्मृति-पदचिह्न के अनुसार क्या अंतर है?

उत्तर

17

धाराओं और भंडारण के बारे में बयान का अर्थ है कि किसी स्ट्रीम में अपने का कोई भंडारण नहीं है। यदि स्ट्रीम का स्रोत संग्रह है, तो जाहिर है कि संग्रह में तत्वों को पकड़ने के लिए संग्रहण है।

के उस लेख से उदाहरणों में से एक लेते हैं:

int sum = shapes.stream() 
       .filter(s -> s.getColor() == BLUE) 
       .mapToInt(s -> s.getWeight()) 
       .sum(); 

मान लें कि shapes एक Collection तत्वों के लाखों लोगों की गई है। कोई कल्पना कर सकता है कि filter ऑपरेशन स्रोत के तत्वों पर पुन: सक्रिय होगा और परिणामों का अस्थायी संग्रह बनाएगा, जिसमें लाखों तत्व भी हो सकते हैं। mapToInt ऑपरेशन तब उस अस्थायी संग्रह पर फिर से शुरू हो सकता है और इसके परिणामों को सारांशित करने के लिए उत्पन्न कर सकता है।

ऐसा नहीं है कि यह कैसे काम करता है। कोई अस्थायी, मध्यवर्ती संग्रह नहीं है। स्ट्रीम ऑपरेशंस पाइपलाइन होते हैं, इसलिए filter से उभरते तत्व mapToInt और तब से sum तक संग्रहित किए बिना संग्रह में पढ़े जाते हैं।

यदि स्ट्रीम स्रोत संग्रह नहीं था - कहें, नेटवर्क संग्रह से तत्वों को पढ़ा जा रहा था - वहां कोई भी संग्रहण नहीं होना चाहिए। निम्नलिखित की तरह एक पाइपलाइन:

int sum = streamShapesFromNetwork() 
       .filter(s -> s.getColor() == BLUE) 
       .mapToInt(s -> s.getWeight()) 
       .sum(); 

तत्वों के लाखों लोगों पर कार्रवाई हो सकती है, लेकिन यह कहीं भी तत्व के लाखों लोगों को स्टोर करने की जरूरत नहीं होगी।

3

धारा के बारे में सोचें कि आपकी डेटा संरचना वाली जल टैंक से जुड़ी नोजल है। नोजल का अपना भंडारण नहीं होता है। निश्चित रूप से, स्ट्रीम प्रदान करने वाला पानी (डेटा) उस स्रोत से आ रहा है जिसमें भंडारण है, लेकिन स्ट्रीम में स्वयं का कोई भंडारण नहीं है। अपने टैंक (डेटा संरचना) में एक और नोजल (स्ट्रीम) को जोड़ने से डेटा की पूरी नई प्रतिलिपि के लिए भंडारण की आवश्यकता नहीं होगी।

+0

प्रतिक्रिया के लिए धन्यवाद! मैं डेटा स्ट्रीमिंग भाग को समझता हूं, लेकिन अगर मैं स्ट्रीमिंग के विरोध में सीधे संग्रह का उपयोग करना चाहता हूं तो मेमोरी (स्टोरेज) ओवरहेड क्या है? अगर मैं सीधे संग्रह का उपयोग करता हूं तो मैं ढेर पर संग्रह तक पहुंचता हूं, अगर मैं इसे स्ट्रीम करता हूं, तो भी मैं ढेर पर रहने वाले संग्रह से डेटा स्ट्रीम कर रहा हूं। दोनों तरीकों से मेमोरी पदचिह्न एक ही तरह से बना रहता है। अगर मैं गलत हूं/यहां कुछ याद कर रहा हूं तो कृपया मुझे सही करें। – user3587411

+0

@ user3587411: अनिवार्य रूप से कोई अंतर नहीं है। एक तरीका कुछ और ढेर फ्रेम और अस्थायी वस्तुओं का उपयोग कर सकता है, लेकिन यह केवल कुछ बाइट्स है। – user2357112

+0

* "किसी भी तरह से मेमोरी पदचिह्न दोनों तरीकों में समान रहता है।" * स्ट्रीम का उद्देश्य स्मृति को सहेजना नहीं है। – Radiodef

3

एक धारा सिर्फ एक डेटा की दृश्य है, यह अपने आप में कोई भंडारण है और आप अंतर्निहित संग्रह संशोधित नहीं कर सकते (यह मानते हुए कि यह एक धारा है कि शीर्ष एक संग्रह पर बनाया गया था है) धारा के माध्यम से। यह "केवल पढ़ने के लिए" पहुंच की तरह है।

यदि आपके पास कोई आरडीबीएमएस अनुभव है - यह "दृश्य" का सटीक विचार है।

0
  1. संग्रह एक डेटा संरचना है। समस्या के आधार पर आप तय करते हैं कि कौन सा संग्रह ArrayList, LinekedList (समय और अंतरिक्ष जटिलता को ध्यान में रखते हुए) जैसे उपयोग किया जाना चाहिए। जहां स्ट्रीम केवल एक प्रसंस्करण प्रकार का उपकरण है, जो आपके जीवन को आसान बनाता है।

  2. अन्य अंतर यह है कि आप संग्रह पर स्मृति डेटा संरचना के रूप में विचार कर सकते हैं, जहां आप तत्व जोड़ सकते हैं, हटा सकते हैं। जहां स्ट्रीम आप दो प्रकार के ऑपरेशन कर सकते हैं:

    ए। इंटरमीडिएट ऑपरेशन: परिणाम सेट पर फ़िल्टर, मानचित्र, क्रम, सीमा
    बी। टर्मिनल ऑपरेशन: प्रत्येक के लिए, एक संग्रह में परिणाम सेट एकत्र करें।

    लेकिन यदि आप देखते हैं, स्ट्रीम के साथ आप तत्वों को जोड़ या हटा नहीं सकते हैं।

  3. स्ट्रीमइटरेटर की तरह है, तो आप धारा के माध्यम से संग्रह पार कर सकते हैं है। ध्यान दें, आप केवल एक बार धारा पार कर सकते हैं, मैं आपको बेहतर ढंग से समझने के लिए एक उदाहरण देता है:

example1:

List<String> employeeNameList = Arrays.asList("John","Peter","Sachin"); 
    Stream<String> s = employeeNameList.stream(); 

    // iterate through list 
    s.dorEach(System.out :: println); // this work's perfectly fine 
    s.dorEach(System.out :: println); // you will get IllegalStateException, stating stream already operated upon 

तो, क्या आप अनुमान लगा सकते हैं है, संग्रह आप के रूप में कई पुनरावृति कर सकते हैं जितनी बार आप चाहते हैं। लेकिन स्ट्रीम के लिए, एक बार जब आप पुन: प्रयास करेंगे, तो यह याद नहीं होगा कि इसे क्या करना है। तो, आपको इसे फिर से निर्देशित करने की आवश्यकता है।

मुझे उम्मीद है, यह स्पष्ट है।

संबंधित मुद्दे