2015-10-28 5 views
9

मैं Map<Double, Double> में डबल्स की एक सूची स्ट्रीम करने की कोशिश कर रहा हूं, जहां कुंजी मूल सूची में डबल्स हैं, और मान कुछ गणना मूल्य हैं। - यह एक चक्रीय निष्कर्ष के बारे में शिकायत हैमैं लैम्बडा पैरामीटर को प्रयोग करने योग्य वस्तुओं में कैसे परिवर्तित करूं?

// "values" is a List<Double> that was passed in 
ImmutableMap<Double, Double> valueMap = values.parallelStream() 
    .collect(Collectors.toMap(p -> p, p -> doThing(values, p))); 

private Double doThing(List<Double>, Double p) { 
    Double computedValue = 0.0; 
    // Do math here with p 
    return computedValue; 
} 

हालांकि, इंटेलीजे शिकायत कर रहा है कि p -> p एक वैध लैम्ब्डा अभिव्यक्ति नहीं है:

इस तरह मेरे कोड दिखता है। मुझे doThing पर कॉल करने में त्रुटि भी मिल रही है, क्योंकि p एक लैम्ब्डा पैरामीटर है और डबल नहीं है।

जब मैं p को पर doThing पर कॉल करने का प्रयास करता हूं, तो वह कास्ट करने में विफल रहता है।

क्या मुझे कुछ वास्तव में स्पष्ट याद आ रही है? ऐसा लगता है कि वास्तव में मेरे लैम्ब्डा पैरामीटर के साथ कुछ भी करने का कोई तरीका नहीं है ...

उत्तर

6

मुझे लगता है कि यहां समस्या यह है कि आपका संग्रह ऑपरेशन Map<Double, Double> देता है लेकिन valueMap का प्रकार ImmutableMap<Double, Double> है।

आप पैरामीटर के लिए doThing में पैरामीटर भी भूल गए थे, लेकिन मुझे लगता है कि यह प्रश्न लिखते समय केवल एक टाइपो था।

+0

आप टाइपो के बारे में सही हैं, इसके बारे में खेद है। ऐसा लगता है कि एक इम्यूटेबल मैप के बजाय इसे मानचित्र में बदलना समस्या को हल करता है। क्या आप जानते हैं कि मैंने जो त्रुटियां देखीं, वे असंबद्ध क्यों थे? इस तरह की एक त्रुटि के लिए, मुझे .collect() और घोषित प्रकार के वैल्यूमैप के रिटर्न वैल्यू के बीच एक प्रकार की मिस्चैच त्रुटि जैसी कुछ अपेक्षा की जाती। क्यों दुनिया में एक घोषित प्रकार विसंगति चक्रवात अनुमान त्रुटि का कारण होगा ...? – sichinumi

+1

@ सिचिनुमी मैंने ग्रहण के साथ इसे आजमाया और _Type विसंगति प्राप्त की: मानचित्र <ऑब्जेक्ट, ऑब्जेक्ट> से इम्यूटेबल मैप <डबल, डबल> _ में कनवर्ट नहीं किया जा सकता। तो आपको मिली त्रुटि वास्तव में थोड़ा अजीब है। – Bubletan

+2

अफैइक, इंटेलिजे नेटबीन्स की तरह 'जावैक' का उपयोग करता है, इसलिए मैं पुष्टि कर सकता हूं कि जेनरिक/टाइप इनफरेंस या लैम्ब्डा एक्सप्रेशन से जुड़े त्रुटि संदेश वास्तविक समस्या से भ्रमित और दूर हो सकते हैं। कभी-कभी, केवल एक भूल गया '),'> 'या'; 'बहुत बेतुका, अनुपयोगी त्रुटि संदेश का कारण बन सकता है। – Holger

1

जैसा कि कहा गया है, समस्या यह है कि Collectors.toMap तत्व को Map<K,U> में जमा करता है (वर्तमान कार्यान्वयन HashMap देता है लेकिन यह एक आंतरिक विवरण है)।

यदि आप ImmutableMap में एकत्र करना चाहते हैं, तो आप collectingAndThen कलेक्टर का उपयोग कर सकते हैं।

डाउनस्ट्रीम कलेक्टर के रूप में Collectors.toMap का उपयोग करें और फ़िशर के रूप में map -> ImmutableMap.copyOf(map) फ़ंक्शन प्रदान करें।

ImmutableMap<Double, Double> valueMap = values.stream() 
       .collect(collectingAndThen(toMap(p -> p, p -> doThing(values, p)), ImmutableMap::copyOf)); 
संबंधित मुद्दे

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