2014-12-14 7 views
26

मैं जानना चाहता हूं कि कैसे एक क्षेत्र में lambda संदर्भ प्राप्त करने के लिए। मैं एक विधि का उपयोग नहीं करना चाहता क्योंकि मेरा क्षेत्र सार्वजनिक फ़ाइनल है। मुझे संदेह है कि यह असंभव है लेकिन मुझे एक स्पष्ट बयान नहीं दिख रहा है।एक क्षेत्र के लिए Lambda संदर्भ

class A { 
    public final String id; 
    ... 
} 

Map<String, A> f(List<A> l) { 
    return l.stream().collect(Collectors.toMap(A::id, Function.identity())); 
} 
+12

'a -> a.id' में शामिल नहीं थे। आप सार्वजनिक क्षेत्रों का उपयोग पहली जगह क्यों कर रहे हैं? –

+3

@JBNizet, मुझे कक्षाओं में सार्वजनिक अंतिम फ़ील्ड पसंद हैं जो डेटा संरचनाएं हैं। वे इंटरफेस को लागू नहीं करते हैं या गहरे पदानुक्रम नहीं करते हैं। –

+0

क्या आप एक लैम्ब्डा संदर्भ चाहते हैं? आप 'सार्वजनिक' फ़ील्ड तक पहुंचने के लिए हमेशा एक उदाहरण का उपयोग कर सकते हैं। 'नया ए() आईडी आईडी की तरह। और मुझे उम्मीद है कि आपके पास सार्वजनिक क्षेत्र बनाने का वास्तव में 'मजबूत' कारण है। लेकिन चूंकि यह 'अंतिम' है, मुझे नहीं लगता कि यह एक समस्या पैदा करेगा। –

उत्तर

21

तुम हमेशा एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं:

return l.stream().collect(Collectors.toMap(a -> a.id, Function.identity())); 

मुझे लगता है कि "विधि संदर्भ" एक कारण के लिए इस तरह से कहा जाता है, और इसलिए तरीकों के लिए ही लागू होते हैं।

+1

वास्तविक जीवन परिदृश्यों के लिए उल्लेखनीय हो सकता है, 'x-> x.id'' क्लासनाम :: आईडी' से छोटा है। केवल दो वर्णों या उससे कम वाले वर्ग नामों का उपयोग करके नमूना कोड के लिए यह अलग दिख सकता है। – Holger

+2

@ होल्गर सच है, लेकिन छोटे कोड हमेशा नहीं होते हैं जो लोग ढूंढ रहे हैं। यदि यह था, तो हम सभी हमारी कक्षाओं और चर नामित करेंगे, बी, सी, डी, ... :)। कुछ लोग लैम्ब्डा अभिव्यक्तियों पर विधि संदर्भ वाक्यविन्यास पसंद कर सकते हैं। – Eran

+2

यह हमेशा ऐसा नहीं होता है जो लोग ढूंढ रहे हैं लेकिन इस विशिष्ट मामले में [ओपी ने खुद कहा "मुझे संदर्भ चाहिए क्योंकि यह छोटा है"] (http://stackoverflow.com/questions/27467946/java8-lambda-reference-to- ए-फील्ड/27467956? noredirect = 1 # comment43374811_27467946) – Holger

26

ऐसा लगता है कि आप उम्मीद कर रहे हैं की तरह है कि जावा क्षेत्र में संदर्भ के लिए एक इसी सुविधा है का संदर्भ के रूप में यह विधि के लिए करता है। पर ये स्थिति नहीं है। विधि संदर्भ लम्बा अभिव्यक्तियों की एक निश्चित श्रेणी के लिए लघुरूप हैं, लेकिन फ़ील्ड के लिए कोई समान वाक्यविन्यास नहीं है। जेएसआर -335 विशेषज्ञ समूह विचार-विमर्श के दौरान फ़ील्ड अक्षरों का पता लगाया गया था (यहां कुछ संदर्भ हैं http://mail.openjdk.java.net/pipermail/lambda-dev/2011-November/004235.html) लेकिन जावा एसई 8.

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