2015-02-28 5 views
51

पर नया मान जोड़ना मौजूदा Stream पर नया मान जोड़ने का कोई अच्छा तरीका है? मैं कल्पना कर सकते हैं कुछ इस तरह है:मौजूदा स्ट्रीम

public <T> Stream<T> addToStream(Stream<T> stream, T elem) { 
    List<T> result = stream.collect(Collectors.toList()); 
    result.add(elem); 
    return result.stream(); 
} 

लेकिन मैं अधिक संक्षिप्त है कि मैं शब्दाडंबर बिना लैम्ब्डा अभिव्यक्ति में उपयोग कर सकते हैं कुछ के लिए देख रहा हूँ।

एक और सवाल दिखाई दिया जब मैं पी ई सी एस लागू करने के लिए सिद्धांत की कोशिश की:

public <T> Stream<? super T> addToStream(Stream<? super T> stream, T elem) { 
    List<? super T> result = stream.collect(Collectors.toList()); //error 
    result.add(elem); 
    return result.stream(); 
} 

वाइल्डकार्ड की तरह लगता है Stream.collect साथ काम नहीं करता और मैं क्यों सोच रहा हूँ। अग्रिम में धन्यवाद।

+0

इस बात की कोई गारंटी नहीं है कि 'संग्रह' 'संग्रह' से 'संग्रह' से वापस लौटाया गया है, आप 'सूची' का समर्थन करने के बजाय 'संग्राहक.कोलेक्शन' का उपयोग कर सकते हैं। – Alex

उत्तर

66

प्रश्न गलत धारणा को बेकार करता है: उस धाराओं में वास्तव में उनका डेटा होता है। वे नहीं करते; धाराएं डेटा संरचनाएं नहीं हैं, वे विभिन्न प्रकार के डेटा स्रोतों में थोक संचालन को निर्दिष्ट करने के साधन हैं।

वहाँ ज्ञात तत्वों (Stream.of) का एक सेट से धाराओं बनाने के लिए या संग्रह (Collection.stream) से इस तरह के Stream.concat के रूप में एक में दो धाराओं के संयोजन के लिए combinators,, और कारखानों कर रहे हैं। इसलिए यदि आप नए तत्वों का वर्णन करने वाली एक नई धारा के साथ-साथ एक नई धारा का निर्माण करना चाहते हैं जो आपके पास मौजूद स्ट्रीम की संगतता है, तो आप इन्हें जोड़ सकते हैं।

आपके पीईसीएस उदाहरण में समस्या यह है कि आपको ? super T की तीन घटनाएं मिली हैं, और आप मानते हैं कि वे एक ही प्रकार का वर्णन करते हैं, लेकिन वे नहीं करते हैं। वाइल्डकार्ड की प्रत्येक घटना एक अद्वितीय कैप्चर के अनुरूप होती है, जो आप नहीं चाहते हैं; आपको उस प्रकार परिवर्तनीय को एक नाम देने की आवश्यकता है ताकि संकलक जानता हो कि सूची का प्रकार और इनपुट स्ट्रीम का प्रकार समान है। (साथ ही, संग्रह को पूरा न करें; यह महंगी है, और संभावित रूप से गैर-टर्मिनेटिंग अगर स्ट्रीम सीमित नहीं है। बस कॉन्सट का उपयोग करें।) तो जवाब है: आपको जेनेरिक गलत मिला है।

public<T> Stream<T> appendToStream(Stream<? extends T> stream, T element) { 
    return Stream.concat(stream, Stream.of(element)); 
} 

आप अपने आप को पी ई सी एस के साथ भ्रमित है क्योंकि आप धारा में "डालने", के बारे में सोच रहे थे जब वास्तव में आप इसे से लेने वाली रहे हैं: यहाँ एक तरह से यह करने के लिए है।

+7

विधि को "appendToStream" नाम नहीं दिया जाना चाहिए? अन्यथा मुझे लगता है कि concat विधि के पैरामीटर स्विच किया जाना चाहिए। –

22

कैसे

के बारे में
return Stream.concat(stream, Stream.of(elem)); 

इस मूल स्ट्रीम संभालने है परिमित है। यदि ऐसा नहीं है, तो आप उन्हें एक उल्टा क्रम में जोड़ सकते हैं।

+0

धन्यवाद, लेकिन दूसरे प्रश्न के बारे में क्या? – Dmytro

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