2015-09-19 6 views
11

जावा में एप्लिकेशन लिखकर java.util.Collection के लिए कई उपयोग मामले हैं। चूंकि java.util.stream.Stream जावा 8 के साथ पेश किया गया था, इसलिए मैं कुछ उपयोग-मामलों में आया जहां यह तय करना मुश्किल है कि इसका उपयोग करना क्या है।स्ट्रीम या लूप का उपयोग करने के बीच निर्णय

उदाहरण के लिए: आप कुछ उपयोग विधियों को लिखने जा रहे हैं।

public static List<?> filterHashToList(int hash, Collection<?> toFilter) { 
    return toFilter.stream() 
     .filter((Object o) -> hash == o.hashCode()) 
     .collect(Collectors.toCollection(LinkedList::new)); 
} 

इस तरह यह लिखने के बारे में क्या:

public static List<?> filterHashToList(int hash, Collection<?> toFilter) { 
    List<Object> result = new LinkedList<>(); 

    for(Object o : toFilter) { 
     if(hash == o.hashCode()) { 
      result.add(o); 
     } 
    } 

    return result; 
} 

दोनों ही तरीकों से एक ही परिणाम का उत्पादन होगा। java.util.stream.Stream और java.util.stream.Collector इंटरफेस हैं, इसलिए यदि मैं कस्टम स्ट्रीम और कलेक्टरों का उपयोग करता हूं तो कार्यान्वयन भी भिन्न हो सकता है।

मुझे लगता है कि पुराने-फ़ैशोइन किए गए लूप-मार्ग का उपयोग करके वहां बहुत सारे कार्यान्वयन हैं।

तो, क्या उपयोग के मामले में उपयोग, स्ट्रीम या लूप का उपयोग करना संभव है? और यदि हां, तो क्या सभी कार्यान्वयनों को अद्यतन किया जाना चाहिए जहां उचित हो?

या मुझे उपयोग विधियों को लागू करके दोनों तरीकों को भी प्रदान करना चाहिए? या क्या मुझे फ़िल्टरिंग प्रक्रिया के बाद स्ट्रीम को वापस लौटाया जाना चाहिए ताकि यदि आवश्यक हो तो आप उसके साथ भी काम कर सकते हैं?

+0

स्ट्रीम के साथ आप वास्तव में आसान समांतरता प्राप्त कर सकते हैं, वे अधिक कॉम्पैक्ट हैं (कुछ "अधिक पठनीय" कहेंगे) और यदि आपके स्ट्रीम वास्तविक "धाराएं" हैं (कुछ गतिशील रूप से बहती है, गतिशील रूप से - एक पर आधारित नहीं है) यहां जैसे निश्चित संग्रह)। लेकिन आपके विशेष मामले में, मुझे लगता है कि आप किसी भी तरह से जा सकते हैं। – mastov

+0

तो क्या हम इसे कम कर सकते हैं: स्ट्रीम को प्राथमिकता दी जाएगी, लेकिन आसान उपयोग में-दोनों मामले ठीक हैं? – narranoid

+3

मैं दो सरल नियमों का उपयोग करूंगा: 1. यदि यह टूटा नहीं है, तो इसे ठीक न करें। 2. जो आप सबसे अधिक पठनीय और रखरखाव पाते हैं उसका उपयोग करें। उस ने कहा, आपके दो उदाहरण एक ही चीज़ वापस नहीं करते हैं: कोई एक ऐरेलिस्ट लौटाता है, और दूसरा एक लिंक्डलिस्ट देता है। –

उत्तर

5

ध्यान रखें कि आपके कार्यान्वयन में आप विशिष्ट संग्रह प्रकार LinkedList जो आम तौर पर ArrayList की तुलना में बहुत खराब प्रदर्शन है जिसके परिणामस्वरूप के साथ चिपके रहते हैं। क्या होगा यदि आपकी विधि का उपयोगकर्ता परिणामी सूची को यादृच्छिक-पहुंच तरीके से उपयोग करना चाहता है? शायद इस विधि के उपयोगकर्ता को एक सरणी की आवश्यकता है, क्योंकि इसे किसी अन्य एपीआई विधि में पारित किया जाना चाहिए जो एक सरणी स्वीकार करता है। कभी-कभी उपयोगकर्ता को यह जानने की आवश्यकता होती है कि इनपुट संग्रह में दिए गए हैशकोड के साथ कितनी ऑब्जेक्ट मौजूद हैं, इस प्रकार परिणामस्वरूप सूची बनाने की कोई ज़रूरत नहीं है।

public static <T> Stream<T> filterHashToList(int hash, Collection<T> toFilter) { 
    return toFilter.stream() 
     .filter(o -> hash == o.hashCode()); 
} 

और इसका इस्तेमाल करते हैं:

filterHashToList(42, input).count(); 

या

filterHashToList(42, input).collect(toCollection(ArrayList::new)); 
जावा-8 रास्ता तरीकों, नहीं संग्रहों से धाराओं लौट सकते हैं और करते हैं फोन करने वाले का फैसला है कि यह कैसे इकट्ठा करने के लिए है

या

filterHashToList(42, input).toArray(); 

यह वा y विधि बहुत सरल हो जाती है, इसलिए आपको शायद इसकी आवश्यकता नहीं है, लेकिन यदि आप अधिक परिष्कृत फ़िल्टरिंग/परिवर्तन करना चाहते हैं, तो यह ठीक है।

तो यदि आप एपीआई को बदलना नहीं चाहते हैं और अभी भी LinkedList वापस कर सकते हैं, तो कार्यान्वयन को बदलने की कोई आवश्यकता नहीं है। लेकिन यदि आप स्ट्रीम एपीआई का उपयोग करने से लाभ लेना चाहते हैं, तो वापसी प्रकार को Stream में बदलना बेहतर होगा।

8

एक उत्तर दिए गए उत्तर की अनुपस्थिति में मैं Brian Goetz उद्धृत करूंगा जो मेरी भावनाओं को उजागर करता है और मुझे कई अन्य लोगों पर संदेह है।

स्ट्रीम या लूप के बारे में कुछ भी जादू नहीं है। आपको वह कोड लिखना चाहिए जो सबसे अधिक पढ़ने योग्य, स्पष्ट और रखरखाव योग्य है। इनमें से कोई भी स्वीकार्य है।

0

मुझे लगता है कि यह संग्रह के अनुमानित आकार और कार्यक्रम के व्यावहारिक अनुप्रयोग पर काफी हद तक निर्भर है। पूर्व थोड़ा अधिक कुशल है, लेकिन मुझे इसे कम पठनीय लगता है और अभी भी ऐसे सिस्टम हैं जो जावा 7 (यानी Google ऐप इंजन) पर चलते हैं। इसके अतिरिक्त, बाद में आगे बढ़ने के लिए अधिक जटिल फ़िल्टर जोड़ने की संभावना अधिक होगी। हालांकि, अगर दक्षता प्राथमिक चिंता है, तो मैं पूर्व के साथ जाऊंगा।

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

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