2017-07-25 9 views
6

निम्नलिखित कोड का उपयोग कर:तर्क बेमेल जब कलेक्ट स्ट्रीम विधि

names = Arrays.asList("A","B","C").stream(); 
List<String> namesAsList = names.collect(() -> new ArrayList<String>(),List::add,List::add); 
System.out.println("Individual Strings put into a list: " + namesAsList); 

संकलन के दौरान निम्नलिखित त्रुटि उत्पन्न:

सूची namesAsList = names.collect (() -> नई ArrayList (), सूची, :: जोड़ने सूची :: जोड़ने); ^ (तर्क विसंगति; अमान्य विधि संदर्भ असंगत प्रकार: ArrayList int में परिवर्तित नहीं किया जा सकता है) जहां आर, टी टाइप-वेरिएबल्स हैं: आर ऑब्जेक्ट विधि संग्रह में घोषित किया गया है (प्रदायक, बायकंस्यूमर, बायकंस्यूमर) टी इंटरफ़ेस में ऑब्जेक्ट घोषित करता है स्ट्रीम 1 त्रुटि

जब मैं सामान्य कोड एक अनियंत्रित अभिव्यक्ति चेतावनी के साथ संकलित दूर करने के लिए कोड में संशोधन:

Stream<String> names = Arrays.asList("A","B","C").stream(); 
List<String> namesAsList = names.collect(() -> new ArrayList(),List::add,List::add); 
System.out.println("Individual Strings put into a list: " + namesAsList); 

मुझे यह त्रुटि क्यों प्राप्त होगा? मुझे उम्मीद है कि समस्या एक int से संबंधित होने की उम्मीद नहीं है।

यदि उत्तर में समस्या का पता लगाने का तरीका शामिल हो सकता है, तो इसकी सराहना की जाएगी, इसलिए मैं सीख सकता हूं कि इन समस्याओं को स्वयं कैसे हल करें।

+3

बस एक साइड नोट, आप तीन तत्व स्ट्रीम विज्ञापन बनाने के लिए 'Stream.of (" ए "," बी "," सी ") का उपयोग कर सकते हैं। – Holger

+0

टिप्पणी के लिए धन्यवाद। मैं जावा 8 परीक्षा के लिए अभ्यास कर रहा हूं, इसलिए मैं अपने अभ्यास कोड में स्ट्रीम ऑब्जेक्ट बनाने के विभिन्न तरीकों का उपयोग करता हूं। –

उत्तर

7

combiner के लिए पारित विधि संदर्भ वास्तव में फिट नहीं है। प्रयास करें:

List<String> namesAsList = names 
    .collect(ArrayList::new, List::add, List::addAll); 

आप List::add पारित कर दिया और संकलक BiConsumer प्रकार का एक combiner उदाहरण के रूप में यह व्याख्या करने के लिए अपना सर्वोत्तम प्रयास कर रही है। इसलिए, अजीब तर्क विसंगति त्रुटि।


इसके अलावा, मुझे लगता है कि आप केवल शोध उद्देश्यों के लिए इसे लागू कर रहे हैं। यदि आप एक List करने के लिए एक Stream एकत्र करना चाहते हैं, तो आप बस का उपयोग कर सकते हैं:

.collect(Collectors.toList()); 

क्या आप ArrayList को Stream विशेष रूप से एकत्र करने के लिए चाहते हैं, आप के लिए जा सकते हैं:

.collect(Collectors.toCollection(ArrayList::new)); 
+0

क्यों 'collect.toList() 'का उपयोग करके एकत्रित नहीं करना है? – xenteros

+0

@xenteros मुझे लगता है कि ओपी सीखने की कोशिश कर रहा है कि अपने कलेक्टरों को कैसे कार्यान्वित किया जाए। प्रश्न संकलन समस्या के बारे में था और स्ट्रीम –

+3

से एक सूची प्राप्त करने के बारे में नहीं था, फिर भी आप 'सूची :: जोड़' और 'सूची :: addAll' का उपयोग कर सकते हैं, फिर भी, कथन अभी भी एक पंक्ति में फिट बैठता है ;-) – Holger

6

समस्या में है combiner, विशेष रूप से: List::add वास्तव में List::addAll होना चाहिए।

या अधिक पठनीय इस तरह:

List<String> namesAsList = names.collect(
      () -> new ArrayList<>(), 
      List::add, 
      List::addAll); 

आप फिर से लिख सकते हैं कि लैम्ब्डा अभिव्यक्ति के साथ जब आप अन-यकीन है कि btw हैं:

List<String> namesAsList = names.collect(
      () -> new ArrayList<>(), 
      List::add, 
      (List<String> left, List<String> right) -> { 
       left.addAll(right); 
      }); 

वहाँ अन्य समस्याएं हैं सूचना है कि के रूप में अच्छी तरह से , () -> new ArrayList<String>() की तरह, इस प्रकार का कंपाइलर द्वारा अनुमान लगाया जाएगा, इसलिए <String> की आवश्यकता नहीं है, जैसे: () -> new ArrayList<>()।इसके अलावा इस एक विधि संदर्भ भी तब्दील किया जा सकता है: ArrayList::new, तो अंत में यह और भी आसान होगा:

List<String> namesAsList = names.collect(
      ArrayList::new, 
      List::add, 
      List::addAll); 

यह btw एक ही बात है कि Collectors.toList आंतरिक रूप से करता है, तो आगे भी यह करने के लिए सरल किया जा सकता है:

List<String> namesAsList = names.collect(Collectors.toList()); 

केवल समस्या यह है कि विनिर्देश है कि बदलने के लिए (किसी भी अन्यListArrayList अलावा वापस जाने के लिए) नि: शुल्क है, तो यह लिखा जा सकता है:

List<String> namesAsList = names.collect(Collectors.toCollection(ArrayList::new)); 
+0

ArrayList :: विधि रीफ्रेंस का उपयोग करते समय नया – LazerBanana

+0

@LazerBanana दोनों विकल्प ठीक हैं –

+2

@pivovarit वे लगातार नहीं हैं;) – LazerBanana

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