जवाब है, हमेशा की तरह, "यह निर्भर करता है"। यह निर्भर करता है कि लौटा हुआ संग्रह कितना बड़ा होगा। यह इस बात पर निर्भर करता है कि परिणाम समय के साथ बदलता है या नहीं और परिणाम की महत्वपूर्ण संगति कैसे होती है। और यह इस बात पर बहुत निर्भर करता है कि उपयोगकर्ता उत्तर का उपयोग कैसे करता है।
सबसे पहले, ध्यान दें कि आप हमेशा स्ट्रीम से एक संग्रह प्राप्त कर सकते हैं, और इसके विपरीत:
// If API returns Collection, convert with stream()
getFoo().stream()...
// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());
तो सवाल यह है, जो आपके कॉल करने वालों के लिए अधिक उपयोगी है।
यदि आपका परिणाम अनंत हो सकता है, तो केवल एक ही विकल्प है: स्ट्रीम।
यदि आपका परिणाम बहुत बड़ा हो सकता है, तो आप शायद स्ट्रीम पसंद करते हैं, क्योंकि हो सकता है कि इसे एक बार में भौतिक रूप देने में कोई मूल्य न हो, और ऐसा करने से महत्वपूर्ण ढेर दबाव पैदा हो सकता है।
यदि सभी कॉलर ऐसा करने जा रहा है, तो इसके माध्यम से खोज (खोज, फ़िल्टर, एग्रीगेट) करना चाहिए, तो आपको स्ट्रीम पसंद करनी चाहिए, क्योंकि स्ट्रीम में ये बिल्ट-इन पहले से हैं और संग्रह को भौतिक बनाने की कोई आवश्यकता नहीं है (खासकर यदि उपयोगकर्ता प्रक्रिया नहीं कर सकता है। संपूर्ण परिणाम।) यह एक बहुत ही सामान्य मामला है।
यहां तक कि अगर आपको पता है कि उपयोगकर्ता इसे कई बार प्रसारित करेगा या इसे इधर-उधर रखेगा, तो भी आप इसके बजाय स्ट्रीम को वापस करना चाह सकते हैं, इस तथ्य के लिए कि आप जो भी संग्रह करना चाहते हैं उसे चुनें (जैसे, ArrayList) फार्म वे चाहते हैं, और फिर फोन करने वाले को इसे वैसे भी कॉपी करना होगा। यदि आप एक धारा वापस करते हैं, तो वे कर सकते हैं collect(toCollection(factory))
और इसे ठीक उसी रूप में प्राप्त कर सकते हैं जैसा वे चाहते हैं।
उपरोक्त "पसंद स्ट्रीम" मामले ज्यादातर इस तथ्य से प्राप्त होते हैं कि स्ट्रीम अधिक लचीला है; आप इसे एक संग्रह में संग्रहित करने की लागत और बाधाओं के कारण बिना इसका उपयोग करने के लिए देर से बाँध सकते हैं।
एक मामला जहां आपको एक संग्रह लौटना चाहिए, जब मजबूत स्थिरता की आवश्यकताएं हैं, और आपको एक चलती लक्ष्य का एक सुसंगत स्नैपशॉट तैयार करना होगा। फिर, आप तत्वों को एक संग्रह में रखना चाहेंगे जो नहीं बदलेगा।
तो मैं कहूंगा कि ज्यादातर समय, स्ट्रीम सही उत्तर है - यह अधिक लचीला है, यह आमतौर पर अनावश्यक-भौतिककरण लागतों को लागू नहीं करता है, और यदि आवश्यक हो तो आसानी से अपनी पसंद के संग्रह में बदल सकता है। लेकिन कभी-कभी, आपको एक संग्रह लौटना पड़ सकता है (कहते हैं, मजबूत स्थिरता आवश्यकताओं के कारण), या आप संग्रह वापस करना चाह सकते हैं क्योंकि आप जानते हैं कि उपयोगकर्ता इसका उपयोग कैसे करेंगे और जानते हैं कि यह उनके लिए सबसे सुविधाजनक चीज है।
players.stream()
बस एक ऐसी विधि है जो कॉल करने वाले को एक धारा लौटाती है। असली सवाल यह है कि क्या आप वास्तव में कॉलर को सिंगल ट्रावेल करने के लिए बाध्य करना चाहते हैं, और उसेCollection
एपीआई पर आपके संग्रह तक पहुंच से भी वंचित करना चाहते हैं? हो सकता है कि कॉलर सिर्फaddAll
एक और संग्रह के लिए करना चाहता है ?