2014-11-11 3 views
6

संकलन नहीं है यह कोडCollectors.toMap

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1]))); 

संकलन त्रुटि संकलन नहीं करता है: विधि विभाजन (स्ट्रिंग) System.out.println में प्रकार वस्तु त्रुटि के लिए अपरिभाषित है (जोड़े .stream() संग्रह (collect.toMap (x -> x.split ("=") [0], x -> x.split ("=") [1]));

लेकिन यह एक अच्छा संकलित

List<String> pairs = new ArrayList<>(); 
Map<String,String> map = pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1])); 
System.out.println(map); 

कोई व्याख्या कर सकते हैं क्यों?

अधिक जानकारी

यह था IntelliJ 12; jdk1.8.0_11; विंडोज 64

+2

दोनों संस्करण संकलित और मेरे jdk1.8.0_20 पर ठीक चलाते हैं। आप किस जेडीके का उपयोग कर रहे हैं? – Misha

+0

या तो पुन: उत्पन्न नहीं कर सकता - या तो आपके पास jdk का पुराना संस्करण है या आप एक अलग कंपाइलर (ग्रहण?) का उपयोग कर रहे हैं। – assylias

+0

@ सभी: यह ग्रहण के साथ पुन: उत्पन्न होता है। मैं नए लुना संस्करण का उपयोग कर रहा हूँ। ग्रहण कंपाइलर इस कंपाइलर त्रुटि को दिखाता है। एक सरल "javac ..." कमांड का उपयोग करना ठीक है। – Seelenvirtuose

उत्तर

0

इंटेलिजे के संस्करण अलग-अलग होते हैं (आईडीई में स्रोत संपादक में बस लाल रेखाएं)। कोड सफलतापूर्वक जेडीके द्वारा संकलित किया जाना चाहिए।

IntelliJ 13 आपके कोड के लिए ठीक है। IntelliJ 12 लैम्ब्डा अभिव्यक्ति को खराब तरीके से समर्थन देता है। लैम्ब्डा अभिव्यक्ति का उपयोग करते समय मैंने इंटेलिजे के दो संस्करणों के बीच भी इसी तरह की समस्याओं को पूरा किया।

4

मुझे लगता है कि आप एक आईडीई (जैसे एक्लिप्स) का उपयोग कर रहे हैं। ग्रहण - उदाहरण के लिए - अपने स्वयं के कंपाइलर का उपयोग करता है और "javac" कमांड (जेडीके से) का उपयोग नहीं करता है।

तो, मैं आपकी समस्या का पुनरुत्पादन कर सकता हूं, लेकिन केवल ग्रहण के साथ। बस "javac" के साथ कमांड लाइन पर इस कोड को संकलित करना ठीक है।

समस्या बहुत सरल है: ग्रहण कंपाइलर collect विधि के तर्कों के लिए String प्रकार का अनुमान लगाने में सक्षम नहीं है। तो यह बस Object (जैसा कि यह प्रकार है, संकलक सुरक्षित रूप से अनुमान लगा सकता है) का अनुमान लगाता है। और Objectsplit विधि नहीं जानता है।

आप स्पष्ट रूप लैम्ब्डा के अंदर प्रकार की घोषणा के द्वारा String के बारे में पता करने के लिए मजबूर कर सकते हैं संकलक:

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.toMap((String x) -> x.split("=")[0], x -> x.split("=")[1]))); 

... या स्पष्ट रूप geneirc toMap विधि के लिए सही प्रकार की घोषणा के द्वारा:

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.<String, String, String> toMap(x -> x.split("=")[0], x -> x.split("=")[1]))); 
संबंधित मुद्दे

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