2012-11-14 25 views
5

ठीक है तो मान लें कि मेरे पास वास्तव में एक साधारण वर्ग है, उदा।वस्तुओं की सूची के प्राप्तकर्ताओं से मूल्यों की एक सूची बनाएं

public class Baby { 
    private String Name = "alf"; 
    public String getName() { 
     return Name; 
    } 
} 

अब मैं क्या जानना चाहता हूं। बेबी की एक सूची को देखते हुए, क्या सभी बच्चों के माध्यम से सरल लूपिंग के बजाय बेबी के नामों की सरणी/सरणीसूची बनाने और नई सूची में अपना नाम जोड़ने के लिए जावा में कोई निफ्टी/कूलर/छोटा रास्ता है? इसके समतुल्य:

ArrayList<Baby> babies = new ArrayList<Baby>(); 
/* some code adding a bunch of babies to the arraylist */ 

ArrayList<String> names = new ArrayList<String>(); 
for (Baby b : babies) { 
    names.add(b.getName()); 
} 

... लेकिन कूलर। पता है मेरा क्या मतलब है?

+2

* कूलर *? संभवतः। अधिक पठनीय और समझने योग्य: शायद ही कभी। जब तक हम अंत में lambdas (और विधि हैंडल) नहीं है हम उस से अधिक संक्षेप में लिखने में सक्षम नहीं होंगे। –

+0

@ जोचिमसौयर जब जावा में आधिकारिक दस्तावेज के हिस्से के रूप में 'लैम्बदास' पेश किया जाएगा? –

+0

@ZagorulkinDmitry जावा 8 इसे शामिल करना चाहिए। लेकिन फिर फिर, यह मूल रूप से जावा 7: | के लिए था – amit

उत्तर

0

अच्छा ... बस रखो, नहीं।

कि यह सोचते है कि आप की तरह

ArrayList<String> names = babies.getName(); 

कुछ के लिए देख रहे है कि जावा में जैसा कुछ नहीं है।

हालांकि, अगर आप आप के लिए यह करने के लिए एक नया वर्ग बना सकता है:

public class BabyNameifier { 

    public BabyNameifier(){} 

    public ArrayList<String> Nameify(ArrayList<Baby> babies) { 
     ArrayList<String> names = new ArrayList<String>(); 
     for (Baby b : babies) { 
      names.add(b.getName()); 
     } 
     return names; 
    } 
} 

इस तरह, आप बाद में कह सकते हैं:

ArrayList<Baby> babies = new ArrayList<Baby>(); 
/* some code adding a bunch of babies to the arraylist */ 

BabyNameifier babyNameifier = new BabyNameifier(); 
ArrayList<String> names = babyNameifier.Nameify(babies); 

कौन सा सिर्फ सबसे अच्छे तरीके के बारे में करने के लिए पैदा करेगा व्यवस्थित बेबी नामों को पुनः प्राप्त करें जिन्हें दुनिया ने कभी भी जाना है।

Function<Baby, String> getBabyNameFunction = new Function<Baby, String>() { 
    @Override 
    public String apply(Baby baby) { 
     return baby.getName(); 
    } 
}; 

List<String> babyNames = Lists.transform(babies, getBabyNameFunction); 

कुंजी यहाँ अंतर किया जा रहा है कि babyNames एक मूल सूची जिस पर परिवर्तनों lazily प्रदर्शन कर रहे हैं की दृश्य है:

+0

अहह! असल में, मैं आपके पहले कथन के समान कुछ चित्रित कर रहा था ... 'babies.getNames() 's'; : पी आह मैं सपना देख सकता हूँ। संपादित करें: अभी भी इसका उपयोग करने के लिए "प्रवेश साधन भेजो!" सुविधा। मैं कुछ भी सुपर निफ्टी के लिए एक विकल्प के रूप में अपने विचार की तरह करता हूं - बाद में कोड बहुत अच्छा लग रहा है! – user891876

3

आप Guava'sLists.transform इस्तेमाल कर सकते हैं। प्रलेखन से:

फ़ंक्शन लागू होने पर आलसी रूप से लागू किया जाता है। लौटाई गई सूची के लिए आवश्यक है, लेकिन इसका मतलब है कि फ़ंक्शन List.contains(java.lang.Object) और List.hashCode() जैसे थोक संचालन के लिए कई बार लागू किया जाएगा। इसके लिए पर अच्छा प्रदर्शन करें, फ़ंक्शन तेज़ होना चाहिए। पर आलसी मूल्यांकन से बचने के लिए लौटाई गई सूची को देखने की आवश्यकता नहीं है, लौटाई गई सूची को अपनी पसंद की एक नई सूची में कॉपी करें।

जाहिर है Function को लागू करने के लिए वाक्यविन्यास बल्कि वर्बोज़ है - यह आपके लिए जावा है। मैं आम तौर पर आम तौर पर स्थिरांक के रूप में इस्तेमाल कार्यों कॉल स्थल पर अव्यवस्था और फिर से इन्स्टेन्शियशन से बचने के लिए रखें:

public class Baby { 

    ... 

    public static class Functions { 

     private static final Function<Baby, String> GET_NAME = 
       new Function<Baby, String>() { 
        @Override 
        public String apply(Baby baby) { 
         return baby.getName(); 
        } 
       }; 

     private Functions() { } 

     public static Function<Baby, String> getName() { 
      return GET_NAME; 
     } 
    } 
} 

हाँ, यह और भी अधिक कोड है, लेकिन इसे और अधिक पोषणीय दूर छिपा हुआ और है। फिर कॉल स्थल पर:

List<String> babyNames = Lists.transform(babies, Baby.Functions.getName()); 
+1

लॉल हाँ, जो कि मूल रूप से खोज रहा था उससे थोड़ा अधिक वर्बोज़ है, लेकिन फिर भी शांत है! मैंने पहले कभी इन अमरूद सूचियों के बारे में कभी नहीं सुना है, और यह बिल्कुल सही प्रकार का निफ्टी कोड है जिसे मैं ढूंढ रहा था। धन्यवाद! – user891876

+0

और यदि आपको लगता है कि यह अब अच्छा है, तो हमारे पास * लैम्ब्डास एंड कंपनी है, तो यह 'सूची बेबी नाम = लिस्ट्स। ट्रांसफॉर्म (शिशुओं, बेबी # getName) के रूप में छोटा होगा; '(वाक्यविन्यास थोड़ा अलग हो सकता है, लेकिन कुछ इस तरह)। –

0

आप कूलर जिस तरह से यह करना चाहते हैं? यदि आप वसंत ढांचे को जानते हैं, तो आप भाग्य में हैं!

एप्लिकेशन कॉन्टेक्स्ट में।xml, कुछ इस तरह लिखना:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

<bean id="babyList" class="com.babies.BabyList"> 

    <property name="babyLists"> 
     <list> 
      <bean class="com.babies.Baby"> 
       <property name="name" value="alice" /> 
      </bean> 
      <bean class="com.babies.Baby"> 
       <property name="name" value="bob" /> 
      </bean> 
      <bean class="com.babies.Baby"> 
       <property name="name" value="trudy" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

</beans> 

यहाँ सामान्य जावा में कोड है

package com.babies; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

    public class Main { 
     public static void main(String[] args) { 
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 

      BabyList babyList = (BabyList)context.getBean("babyList"); 
      System.out.println(babyList); 

    } 
    } 

अब आप applicationContext.xml में सूची को संपादित कर सकते जब भी आप जोड़/से किसी भी नाम हटाना चाहते हैं सूची। हार्ड कोड सब कुछ करने की जरूरत नहीं है।

आप इस लिंक से स्प्रिंग ढांचे संग्रह के बारे में अधिक उल्लेख कर सकते हैं: http://www.mkyong.com/spring/spring-collections-list-set-map-and-properties-example/

या यदि आप बस स्प्रिंग बारे में अधिक जानना चाहते हैं, यहाँ एक अच्छा प्रारंभिक बिंदु है: http://www.mkyong.com/tutorials/spring-tutorials/

1

GS Collections के साथ आप एक है ऐसा करने के कुछ तरीके। आप फास्टलिस्ट नामक ऐरेलिस्ट के लिए ड्रॉप-इन प्रतिस्थापन का उपयोग कर सकते हैं।

MutableList<Baby> babies = FastList.newList(); 
/* some code adding a bunch of babies to the fastlist */ 

MutableList<String> names = babies.collect(new Function<Baby, String>() { 
    public String valueOf(Baby baby) { 
     return baby.getName(); 
    } 
}); 

या आप ListIterate उपयोगिता वर्ग के साथ ArrayList का उपयोग कर सकते हैं।

ArrayList<Baby> babies = new ArrayList<Baby>(); 
/* some code adding a bunch of babies to the arraylist */ 

List<String> names = ListIterate.collect(babies, new Function<Baby, String>() { 
    public String valueOf(Baby baby) { 
     return baby.getName(); 
    } 
}); 

यदि आपको परिणाम आदेश की परवाह नहीं है, लेकिन डुप्लिकेट की अनुमति देना चाहते हैं तो आप इसके बजाय एक बैग का उपयोग कर सकते हैं।

MutableList<Baby> babies = FastList.newList(); 
/* some code adding a bunch of babies to the fastlist */ 

MutableBag<String> names = babies.collect(new Function<Baby, String>() { 
    public String valueOf(Baby baby) { 
     return baby.getName(); 
    } 
}, HashBag.<String>newBag()); 

int numberOfBabiesNamedXYZ = names.occurrencesOf("XYZ"); 

यदि आप इस समारोह का उपयोग कर रहे हैं, तो आप इसे बेबी क्लास पर स्थिर रखना चाहते हैं।

नोट: मैं जीएस संग्रह पर एक डेवलपर हूं।

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