2013-10-08 8 views
44

मैं निम्नलिखित "Collectors.toMap()" कॉल में "keyMapper" समारोह पैरामीटर के लिए एक और अधिक संक्षिप्त अभिव्यक्ति साथ आने के लिए कोशिश कर रहा हूँ:संग्राहक.तोMap() keyMapper - अधिक संक्षिप्त अभिव्यक्ति?

List<Person> roster = ...; 

Map<String, Person> map = 
    roster 
     .stream() 
     .collect(
      Collectors.toMap(
       new Function<Person, String>() { 
        public String apply(Person p) { return p.getLast(); } 
       }, 
       Function.<Person>identity())); 

ऐसा लगता है कि मैं इसे इनलाइन में सक्षम होना चाहिए एक लैम्ब्डा अभिव्यक्ति का उपयोग करके, लेकिन मैं संकलित एक के साथ नहीं आ सकता है। (मैं लैम्बडास के लिए काफी नया हूं, इसलिए यह आश्चर्य की बात नहीं है।)

धन्यवाद।

-> अद्यतन:

स्वीकार किए जाते हैं जवाब में बताया गया है

Person::getLast 

मैं के लिए क्या देख रहा था है, और कुछ मैंने कोशिश की थी। हालांकि, बीईटीए_8 रात के ग्रहण की रात का निर्माण समस्या थी - यह गलत के रूप में चिह्नित किया गया था। कमांड लाइन से संकलित जब (जो मुझे पोस्ट करने से पहले किया जाना चाहिए था), यह काम किया। तो, eclipse.org के साथ एक बग फाइल करने का समय।

धन्यवाद।

+1

यह भी ध्यान रखें Collectors.toMap के लिए एक स्थिर आयात एक्सप्रेशन छोटा अभी भी कर देगा, NetBeans हालांकि फिर भी मेरे लिए इन आयात करने जा करने के लिए प्रतीत नहीं होता। –

उत्तर

117

आप एक लैम्ब्डा उपयोग कर सकते हैं आयात:

Collectors.toMap(p -> p.getLast(), Function.identity()) 

या, और अधिक संक्षेप में, आप एक method reference उपयोग कर सकते हैं :: का उपयोग कर:

Collectors.toMap(Person::getLast, Function.identity()) 

और बजाय Function.identity , आप बस बराबर लैम्ब्डा का उपयोग कर सकते हैं:

Collectors.toMap(Person::getLast, p -> p) 

I आप Netbeans का उपयोग करते हैं, जब भी एक अज्ञात वर्ग को लैम्ब्डा द्वारा प्रतिस्थापित किया जा सकता है तो आपको संकेत मिलना चाहिए।

+1

आप अपने अभिव्यक्तियों को कोष्ठक को हटाकर भी कम कर सकते हैं क्योंकि उन्हें एकल तर्कों के लिए आवश्यक नहीं है, यानी 'संग्राहक.टैप (व्यक्ति :: getLast, p -> p) '। –

+1

मुझे भी यकीन है कि पहचान फ़ंक्शन के लिए प्रकार तर्क आवश्यक नहीं है क्योंकि इसे अनुमानित किया जा सकता है। 'Collect.toMap (व्यक्ति :: getLast, Function.identity())' – GuiSim

+0

@GuiSim मुझे लगता है कि यह वास्तव में मामला है - यह जावा 8 के पिछले संस्करणों में एक बग था। – assylias

19
List<Person> roster = ...; 

Map<String, Person> map = 
    roster 
     .stream() 
     .collect(
      Collectors.toMap(p -> p.getLast(), p -> p) 
     ); 

जो अनुवाद होगा, लेकिन मैं इसे चलाता हूं या एपीआई का उपयोग करता हूं। सबसे अधिक संभावना है कि आप fction.identity() के लिए पी -> पी को प्रतिस्थापित कर सकते हैं। और स्थिर toMap (...)

4

हम उसी कुंजी टकराव के मामले में वैकल्पिक विलय समारोह का भी उपयोग कर सकते हैं। उदाहरण के लिए, यदि दो या दो से अधिक व्यक्तियों के पास समान मिलता है() मान, हम मान निर्दिष्ट कर सकते हैं कि मानों को कैसे मर्ज करें। अगर हम ऐसा नहीं करते हैं, तो हम IllegalStateException प्राप्त कर सकते हैं। यहां उदाहरण के इस लक्ष्य को हासिल करने के लिए है ...

Map<String, Person> map = 
roster 
    .stream() 
    .collect(
     Collectors.toMap(p -> p.getLast(), 
         p -> p, 
         (person1, person2) -> person1+";"+person2) 
    ); 
+0

मुझे खेद है लेकिन इसका क्या अर्थ है? '(व्यक्ति 1, व्यक्ति 2) -> व्यक्ति 1 +"; "+ व्यक्ति 2)' –

+0

यदि मैप किए गए कुंजियों में डुप्लीकेट होते हैं (ऑब्जेक्ट के अनुसार।बराबर (ऑब्जेक्ट)), मान मैपिंग फ़ंक्शन प्रत्येक बराबर तत्व पर लागू होता है, और परिणाम प्रदान किए गए विलय समारोह का उपयोग करके विलय कर दिए जाते हैं। Pls लिंक https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function का संदर्भ लें -java.util.function.BinaryOperator- – KayV

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