2016-05-12 15 views
10

मुझे हाल ही में कुछ जावा कोड को ट्विक करने का अवसर मिला और कुछ नई जावा 8 सुविधाओं का लाभ उठाने में सक्षम था। एक विशेष मामले में मुझे वस्तुओं की सूची से (स्ट्रिंग) .Name गुणों की एक सूची प्राप्त करने की आवश्यकता थी। मैं क्या किया का एक सरलीकृत उदाहरण था: (? अभी तक)सी # जावा 8 के बराबर "विधि संदर्भ"

// sample data: <Thing> objects have a single String property called "Name" 
List<Thing> thingList = new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2"))); 

// first pass 
List<String> nameList = new ArrayList<>(); 
thingList.forEach(x -> nameList.add(x.getName())); 

// refinement 1: use stream, map, and collect 
List<String> nameList1 = thingList.stream().map(x -> x.getName()).collect(Collectors.toList()); 

// refinement 2: use "Thing::getName" method reference 
List<String> nameList2 = thingList.stream().map(Thing::getName).collect(Collectors.toList()); 

मैं देखना कैसे उन दृष्टिकोण सी # करने के लिए अनुवाद होगा उत्सुक था, और मैं

// sample data: <Thing> objects have a single String property called "Name" 
var thingList = new List<Thing> { new Thing("Thing1"), new Thing("Thing2") }; 

// first pass 
var nameList = new List<String>(); 
thingList.ForEach(x => nameList.Add(x.Name)); 

// refinement 1: use Select and ToList 
List<String> nameList1 = thingList.Select(x => x.Name).ToList(); 

मिला क्या मैं नहीं मिला है है लम्बा अभिव्यक्ति को कुछ (थोड़ा सा) अधिक संक्षिप्त के साथ बदलने के लिए "परिशोधन 2" के बराबर एक सी # समकक्ष। क्या इस मामले में जावा 8 "विधि संदर्भ" के बराबर सी # # है, यह देखते हुए कि मैं प्रत्येक ऑब्जेक्ट की संपत्ति प्राप्त करने की कोशिश कर रहा हूं (जो जावा में getPropertyविधि का उपयोग करके किया जाता है)?

उत्तर

4

आप Thing के बाहर एक विधि (या एक स्थिर Thing विधि) की घोषणा करने के लिए होता है, तो आप इसे करने के लिए एक विधि-समूह संदर्भ दे सकते हैं:

private string GetName(Thing thing) 
{ 
    return thing.Name; 
} 

... 

List<String> nameList1 = thingList.Select(GetName).ToList(); 

सी # 6 में, आप भी एक का उपयोग कर सकते अभिव्यक्ति शरीर समारोह लाइनों के एक जोड़े को बचाने के लिए:

private string GetName(Thing thing) => thing.Name; 
+0

लेकिन '.Select (getName)' एक वाक्य रचना चीनी है कि एक विधि संदर्भ की तरह लग रहा है, अनिवार्य रूप से यह अभी भी '.Select (x => getName (एक्स)) '। –

+1

बहुत यकीन है कि यह एक विधि संदर्भ है। लेकिन तो क्या चीनी है? ओपी सिर्फ छोटा कोड चाहता है। क्या फर्क पड़ता है? – Blorgbeard

+5

@ डैनी चेन: "अनिवार्य रूप से" जावा 8 का विधि संदर्भ भी निर्दिष्ट विधि का आह्वान करते हुए लैम्ब्डा अभिव्यक्ति के लिए वाक्य रचनात्मक चीनी है। हालांकि, तकनीकी रूप से, यह एक और तरीका है, लैम्ब्डा अभिव्यक्ति लैम्ब्डा के शरीर को पकड़ने वाली एक अतिरिक्त विधि के संदर्भ में सिंटैक्टिक चीनी है। – Holger

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