2017-03-09 11 views
5

मेरे पास संग्रह आईडीलिस्ट है जिसमें स्ट्रिंग आईडी हैं। फ़ंक्शन प्राप्त करें एकल आईडी आइटमों का संग्रह (MyType टाइप करें) के लिए चयन रिटर्न। इसके अलावा, यह शून्य वापस आ सकता है।जावा स्ट्रीम: सूची में कुल सभी शून्य-संग्रह संग्रह में प्राप्त नहीं किया गया है()

तो idList से कई आईडी के लिए मुझे कुछ नल और कुछ संग्रह मिलेंगे।

लक्ष्य अंतिम सूची में आईडी के सेट के लिए getCollection के सभी उत्तरों एकत्र करना है।

मैं की तरह

List<MyType> reply = idList.stream().map(id -> getCollection(id)) 
     .filter(p -> p != null).collect(Collectors.toList()); 

कुछ कल्पना की है, लेकिन यह एक वैध अभिव्यक्ति होने के लिए प्रतीत नहीं होता। इसे वैध कैसे बनाएं?

इसके अलावा, इस कार्यान्वयन के प्रदर्शन के बारे में क्या?

उत्तर

4

आप flatMap उपयोग करने की आवश्यकता -

दोनों नक्शे और flatMap हो सकता है - आप map और flatMap आपरेशन के बीच मतभेद के बारे में सोच रहे हैं, तो

List<MyType> reply = idList.stream() 
    .map(id -> getCollection(id)) 
    .filter(collection -> collection != null) 
    .flatMap(Collection::stream) 
    .collect(Collectors.toList()); 

, तो आप this excellent answer संपर्क कर सकते हैं एक स्ट्रीम पर लागू होता है और वे दोनों स्ट्रीम स्ट्रीम करते हैं। अंतर यह है कि नक्शा संचालन प्रत्येक इनपुट मान के लिए एक आउटपुट मान उत्पन्न करता है, जबकि फ्लैटमैप ऑपरेशन प्रत्येक इनपुट मान के लिए मनमाना संख्या (शून्य या अधिक) मान उत्पन्न करता है।

यह प्रत्येक ऑपरेशन के लिए तर्कों में प्रतिबिंबित होता है।

नक्शा ऑपरेशन एक फंक्शन लेता है, जिसे इनपुट प्रवाह में प्रत्येक मान के लिए कहा जाता है और एक परिणाम मान उत्पन्न करता है, जिसे आउटपुट स्ट्रीम पर भेजा जाता है।

फ्लैटमैप ऑपरेशन एक ऐसा कार्य करता है जो संकल्पनात्मक रूप से एक मान का उपभोग करता है और मूल्यों की मनमानी संख्या उत्पन्न करता है। हालांकि, जावा में , यह मानों की मनमाने ढंग से संख्या वापस करने के लिए एक विधि के लिए बोझिल है, क्योंकि विधियां केवल शून्य या एक मान लौटा सकती हैं। एक एक एपीआई की कल्पना कर सकता है जहां फ्लैटमैप के लिए मैपर फ़ंक्शन एक मान लेता है और एक सरणी या मानों की एक सूची देता है, जिसे आउटपुट पर भेजा जाता है। यह देखते हुए कि यह स्ट्रीम लाइब्रेरी है, विशेष रूप से उपयुक्त तरीका वापसी मूल्यों की मनमानी संख्या का प्रतिनिधित्व करने के लिए मैपर फ़ंक्शन स्वयं को स्ट्रीम करने के लिए है! मैपर द्वारा लौटाई गई धारा से मान स्ट्रीम से निकाले जाते हैं और आउटपुट स्ट्रीम पर जाते हैं। मैपर फ़ंक्शन पर प्रत्येक कॉल द्वारा लौटाए गए मूल्यों के "क्लंप" को आउटपुट स्ट्रीम, में बिल्कुल अलग नहीं किया जाता है, इस प्रकार आउटपुट को "चपटा" कहा जाता है।

विशिष्ट उपयोग flatMap की नक्शाकार समारोह Stream.empty() वापस जाने के लिए अगर यह Stream.of की तरह शून्य मान, या कुछ भेजना चाहती है के लिए है (ए, बी, सी) अगर यह कई मूल्यों वापसी चाहता है । लेकिन निश्चित रूप से किसी भी स्ट्रीम को वापस किया जा सकता है।

+0

फ्लैटमैप का उपयोग करने के कारण के बारे में संक्षिप्त स्पष्टीकरण दूसरों को –

+0

@ManuelS को समझने में भी मदद करेगा। यदि आप नीले रंग में रंगीन फ्लैटमैप लिंक पर क्लिक करते हैं, तो फ्लैटमैप का एक संक्षिप्त विवरण होगा। – John

+0

flatmap स्ट्रीम प्राप्त करने की आवश्यकता है चयन() रिटर्न सूची? हो सकता है कि आपको इस तरह अपना कोड बदलना होगा ... 'stream()। नक्शा (आईडी -> getCollection (id))। flatMap (सूची :: स्ट्रीम)' –

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