2011-09-05 18 views
19

जब कोई List<Person> है, तो क्या इसमें से person.getName() की सूची प्राप्त करने की संभावना है? वहाँ उस के लिए एक तैयार कॉल है, या मैं की तरह एक foreach पाश लिखने के लिए है:किसी सूची में किसी ऑब्जेक्ट के गुणों की सूची प्राप्त करें

List<Person> personList = new ArrayList<Person>(); 
List<String> namesList = new ArrayList<String>(); 
for(Person person : personList){ 
    namesList.add(personList.getName()); 
} 

उत्तर

48

जावा 8 और इसके बाद के संस्करण:

List<String> namesList = personList.stream() 
            .map(Person::getName) 
            .collect(Collectors.toList()); 

क्या आप वाकई एक मिल बनाने के लिए की जरूरत है

        ... 
            .collect(Collectors.toCollection(ArrayList::new)); 

: ArrayList एक परिणाम के रूप में, आप करने के लिए अंतिम पंक्ति बदलना होगा

जावा 7 और नीचे:

जावा 8 से पहले मानक संग्रह API में ऐसे परिवर्तन के लिए कोई समर्थन नहीं है। आपको एक लूप लिखना होगा (या अपने आप के कुछ "मानचित्र" फ़ंक्शन में लपेटना होगा), जब तक कि आप कुछ fancier संग्रह API/एक्सटेंशन पर न आएं।

(अपने जावा स्निपेट में लाइनें ठीक लाइनों मैं का प्रयोग करेंगे कर रहे हैं।)

अपाचे कॉमन्स में, आप CollectionUtils.collect इस्तेमाल कर सकते हैं और एक Transformer

अमरूद में, आप Lists.transform विधि का उपयोग कर सकते हैं।

0

आपको प्रत्येक ऑब्जेक्ट getName() पर लूप करना होगा और एक्सेस करना होगा।

शायद guava कुछ फैंसी कर सकते हैं ...

+0

उपयोग करने के लिए अमरूद के साथ एक उदाहरण दे सकते हैं? – Sonnenhut

0

कम से कम जब तक एक आप सुझाव से जावा में ऐसा करने के लिए, जैसा कि आप मानक जावा संग्रह API के साथ चिपके हुए कर रहे हैं और कोई दूसरा रास्ता नहीं है।

मैं इस तरह से कुछ समय के लिए इस तरह की इच्छा कर रहा हूं ... विशेष रूप से जब मैंने रूबी की मीठी आजादी का स्वाद लिया, जिसमें बंद चीजों के साथ काम करने और चुनने जैसी अद्भुत चीजें हैं।

1

http://code.google.com/p/lambdaj/ पर एक नज़र डालें - जावा के लिए LINQ समतुल्य है। इसका उपयोग करने से सभी वस्तुओं को फिर से शुरू नहीं किया जाएगा, लेकिन कोड अधिक संकुचित हो जाएगा।

+1

मुझे आश्चर्य है कि यह जावा 8 में शामिल किया जा रहा है या नहीं। –

2

मुझे लगता है कि आपको हमेशा ऐसा करने की आवश्यकता होगी। लेकिन अगर आपको हमेशा ऐसी चीजों की आवश्यकता होगी, तो मैं एक और कक्षा बनाने का सुझाव दूंगा, उदाहरण के लिए इसे People कहें जहां personList एक चर है।

कुछ इस तरह:

class People{ 
    List<Person> personList; 
    //Getters and Setters 

    //Special getters 
    public List<string> getPeopleNames(){ 
     //implement your method here   
    } 

    public List<Long> getPeopleAges(){ 
     //get all people ages here 
    } 
} 

इस मामले में आप केवल हर बार एक गेटर कॉल करने के लिए की आवश्यकता होगी।

2

जांची नहीं लेकिन यह विचार है:

public static <T, Q> List<T> getAttributeList(List list, Class<? extends Q> clazz, String attribute)  
{ 
    List<T> attrList= new ArrayList<T>(); 

    attribute = attribute.charAt(0).toUpperCase() + attribute.substring(1); 
    String methodName = "get"+attribute; 

    for(Object obj: personList){ 
     T aux = (T)clazz.getDeclaredMethod(methodName, new Class[0]).invoke(obj, new Object[0]); 
     attrList.add(aux); 
    } 
} 
5

इस

Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName")); 

उपयोग Apache Commons संग्रह API का प्रयास करें।

6

आप इस किया है हो सकता है, लेकिन दूसरों

जावा 1,8

List<String> namesList = personList.stream().map(p -> p.getName()).collect(Collectors.toList()); 
संबंधित मुद्दे

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