इस जावा 8 स्ट्रीम कलेक्ट () विधि को कैसे समझें?


12

मैं एक अंतर सरणी को सूची में बदलने की कोशिश कर रहा था और मैंने जावा 8 स्ट्रीम का उपयोग करने का अपरिचित मार्ग लिया और इसके साथ आया

Arrays.stream(arr).boxed().collect(Collectors.toList());

मुझे अभी भी इस लाइन को समझने में कठिनाई है, ज्यादातर,

  1. Collectors.toList()इस मामले में ArrayList<Integer>कार्यान्वयन Listइंटरफ़ेस क्यों है ? क्यों LinkedList<Integer>या कोई अन्य सामान्य वर्ग Listइंटरफ़ेस के अनुरूप नहीं है? मुझे इसके बारे में कुछ भी नहीं मिल सकता है, सिवाय इसके कि यहां ArrayList का संक्षिप्त उल्लेख एपीआई नोट्स अनुभाग में है।

  2. बायें पैनल का क्या मतलब है? जाहिर है जेनेरिक रिटर्न टाइप ( यहां मेरे कोड में)। और मुझे लगता है कि विधि का सामान्य प्रकार तर्क है, लेकिन वे कैसे निर्दिष्ट हैं? मैंने कलेक्टर इंटरफ़ेस डॉक में देखा और इसे अवशोषित करने में सक्षम नहीं था।यहां छवि विवरण दर्ज करें Stream.collect()RArrayList<Integer><R, A>


2
1. यह हुड के नीचे एक वास्तविक सूची का उपयोग करता है, जाहिर है। लेकिन वास्तविक अंतर्निहित सूची प्रकार को प्रकट करना एपीआई के लिए नासमझी होगी। तब से वे भविष्य में अब कार्यान्वयन को कभी नहीं बदल सकते थे। सामान्य तौर पर, यह केवल एक अच्छा विचार है कि केवल इंटरफेस को उजागर करें और कभी भी वास्तविक अंतर्निहित प्रकार न करें। 2. Rपरिणामी प्रकार का सामान्य प्रकार है। Aकलेक्टर के मध्यवर्ती संचय प्रकार के सामान्य प्रकार। यह लागू करने का विवरण है कि एक कलेक्टर कैसे काम करता है। यह विभाजित करता है और जीतता है, समानांतर प्रसंस्करण के लिए भी, पहले मध्यवर्ती प्रकारों में एकत्र करता है।
झाबुजार्ड

10
आप लगभग कभी नहीं वास्तव में LinkedList चाहते हैं। जोश बलोच के एक ट्वीट में लिखा है, "मैंने इसे लिखा है, और मैं इसका उपयोग कभी नहीं करता"।
एंडी टर्नर

4
"क्यों है Collectors.toList()इस मामले रिटर्न में एक ArrayList<Integer>" यह एक वापस नहीं हो सकता है ArrayListListकार्यान्वयन है अपरिभाषित है, तो आप क्या कार्यान्वयन यह रिटर्न पर भरोसा नहीं कर सकते हैं। जैसा कि जादव कहते हैं: "सूची के प्रकार , परिवर्तनशीलता, क्रमबद्धता, या सूची की थ्रेड-सुरक्षा की कोई गारंटी नहीं है ;"
एंड्रियास

3
और toList()एक ArrayListया नहीं लौटा रहा है List- यह एक लौट रहा है Collector, जो अंततः बनाएगा और वापस लौटेगा List- यह भी दस्तावेज में कहा गया है: "... प्रकार की कोई गारंटी नहीं है , परिवर्तनशीलता, क्रमबद्धता, या सूची की थ्रेड-सुरक्षा लौटी; यदि लौटी हुई सूची पर अधिक नियंत्रण आवश्यक है, तो कॉलेक्शन (सप्लायर) का उपयोग करें .... "
user85421-Banned

3
मैं दृढ़ता से अनुशंसा पैकेज प्रलेखन
होल्गर

जवाबों:


18
  1. यह एक डिफ़ॉल्ट कार्यान्वयन है। ArrayListउपयोग किया जाता है, क्योंकि यह अधिकांश उपयोग के मामलों में सबसे अच्छा है, लेकिन अगर यह आपके लिए उपयुक्त नहीं है, तो आप हमेशा अपने स्वयं के कलेक्टर को परिभाषित कर सकते हैं और आपके लिए कारखाने प्रदान Collectionकर सकते हैं:

    Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
  2. हां, Aऔर Rइस पद्धति के सामान्य पैरामीटर हैं, Rवापसी प्रकार Tहै, इनपुट प्रकार है और Aएक मध्यवर्ती प्रकार है, जो तत्वों को इकट्ठा करने की पूरी प्रक्रिया में दिखाई देता है (शायद दिखाई नहीं देता है और इस फ़ंक्शन की चिंता नहीं करता है)। जावदोक की शुरुआतCollector उन प्रकारों को परिभाषित करती है (वे पूरे डॉक के अनुरूप हैं):

    टी - कमी ऑपरेशन
    ए के लिए इनपुट तत्वों का प्रकार - कटौती ऑपरेशन के उत्परिवर्तनीय संचय प्रकार (अक्सर कार्यान्वयन विस्तार के रूप में छिपा हुआ)
    आर - कमी ऑपरेशन का परिणाम प्रकार


ठीक है मैं समझा। मुझे लगता है कि मुझे वास्तव List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());में myList पर सूची इंटरफ़ेस में घोषित तरीकों को पूरा करने और कॉल करना चाहिए । अन्यथा मैं संभावित रूप से खुद को जोखिम में डाल रहा होता, अगर ओरेकल जावा 8u1024 या 15 में डिफ़ॉल्ट कार्यान्वयन को बदलने का फैसला करता है?
user3207158

2
@ user3207158 विधि एक रिटर्न देता है List, इसलिए जो भी कार्यान्वयन किया जाता है, व्यवहार समान है। यह संभावना नहीं है कि इंटरफ़ेस को जावा के नए संस्करणों में बदल दिया जाएगा।
एन्ड्रॉनिकस

1
  1. इस मामले में संग्राहक.toList () एक ArrayList सूची इंटरफ़ेस लागू क्यों करता है?

जैसा कि विधि परिभाषा बताती है कि यह कलेक्टर आपूर्तिकर्ता के साथ एक कलेक्टर कार्यान्वयन देता है ArrayList। इसलिए, यह नीचे दी गई विधि परिभाषा से बहुत स्पष्ट है कि Collectors.toListहमेशा ArrayList कलेक्टर ( While it's arguable why toList not toArrayList word is used in method name) देता है।

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
  1. <R, A> R collect(Collector<? super T, A, R> collector)साधन के बाएँ पैनल क्या करता है

यदि आप प्रलेखन टिप्पणियों का उल्लेख करते हैं, तो यह सटीक रूप से उल्लेख करता है कि ये सामान्य प्रकार क्या हैं:

/*
      @param <R> the type of the result
      @param <A> the intermediate accumulation type of the {@code Collector}
      @param collector the {@code Collector} describing the reduction
      @return the result of the reduction
*/
 <R, A> R collect(Collector<? super T, A, R> collector);

धन्यवाद महोदय। आपको Collectors.toList()पहली बार स्निपेट का स्रोत कोड कहां से मिला ? क्या यह Openjdk है?
user3207158

1
नहीं! मैंने अपने intelli j में स्रोत कोड डाउनलोड कर लिया है
विनय प्रजापति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.