2011-08-28 10 views
23

मान लीजिए कि मैं कारों की एक सूची है:मैं सूची के प्रत्येक तत्व पर एक विधि कैसे कॉल कर सकता हूं?

public class Car { 
    private String brand; 
    private String name; 
    private String color; 

    public Car() { // ... } 

    public getName() { return name; } 
    // ... 
} 

// Suppose that I have already init the list of car 
List<Car> cars = //... 
List<String> names = new ArrayList<String>(); 


for (Car c : cars) { 
    names.add(c.getName()); 
} 

मैं कैसे कोड ऊपर छोटा कर सकते हैं? संक्षेप में, मैं सूची के प्रत्येक तत्व पर एक विधि कैसे कॉल कर सकता हूं?

उदाहरण के लिए, पायथन में:

[car.name for car in cars] 

उत्तर

17

अद्यतन:

scribaniwannabe के answer एक जावा 8 एक लैम्ब्डा अभिव्यक्ति का उपयोग कर समाधान के लिए देखें।

मूल पूर्व जावा 8 जवाब:

प्रभाव अमरूद के साथ प्राप्त किया जा सकता है, Function कार्यान्वयन पहले से ही अधिक से अधिक वर्बोज़ है तुम्हारे पास क्या है:

List<Car> cars = //... 

Function<Car, String> carsToNames = new Function<Car, String>() { 
    @Override 
    public String apply(Car car) { 
     return car.getName(); 
    } 
} 

List<String> names = Lists.transform(cars, carsToNames); 

(ध्यान रखें कि Lists.transform एक ऐसा दृश्य देता है जो फ़ंक्शन को आलसी रूप से लागू करेगा - यदि आप तत्काल प्रतिलिपि चाहते हैं, तो आपको लौटाई गई सूची को एक नई सूची में कॉपी करने की आवश्यकता है।)

तो यह करता है आपको अपने कोड को छोटा करने में मदद नहीं करता है, लेकिन यह जावा में आपकी वांछित प्रभाव को प्राप्त करने के लिए वर्बोज़ का एक उदाहरण है।

संपादित करें: आपको lambdaj पर एक ऐसी लाइब्रेरी दिखाई दे सकती है, जो एक ऐसी लाइब्रेरी है जो आप ढूंढ रहे हैं। मैं इस बाहर अपने आप को प्रयास नहीं किया है, लेकिन मुखपृष्ठ इस उदाहरण दिखाता है:

List<Person> personInFamily = asList(new Person("Domenico"), new Person("Mario"), new Person("Irma")); 
forEach(personInFamily).setLastName("Fusco"); 
2

से ब्रेसिज़ और/या एक लाइन के लिए सभी कोड का स्थान बदलना है, जो एक अच्छा विचार नहीं हो सकता है, आप नहीं कर सकते से छुटकारा पाने के अन्य।

38

जावा 8 (उम्मीद है) में लैम्ब्डा अभिव्यक्ति का कुछ रूप होगा, जो इस तरह के कोड को और अधिक व्यवहार्य बना देगा। (चाहे सूची समझ की तरह कुछ भी होगा, एक और मामला है।)

आपकी इच्छा दी गई है!

--- संपादित करें ---
lol के रूप में अगर क्यू पर: forEach()

निश्चित रूप से इस पर गौर करें।

अपने प्रश्न के लिए विशेष रूप से, यह folowing हो जाता है:

// Suppose that I have already init the list of car 
List<Car> cars = //... 
List<String> names = new ArrayList<String>(); 

// LAMBDA EXPRESSION 
cars.forEach((car) -> names.add(car.getName())); 

यह वास्तव में काफी अविश्वसनीय है कि वे क्या यहाँ किया गया है। मैं इसे भविष्य में इस्तेमाल करने के लिए उत्साहित हूं।

--- संपादित करें ---
मुझे इसे जल्द ही देखना चाहिए था लेकिन मैं इसका विरोध नहीं कर सकता लेकिन इसके बारे में पोस्ट कर सकता हूं।

जेडीके 8 में जोड़ा गया स्ट्रीम कार्यक्षमता map method के लिए अनुमति देता है।

// Suppose that I have already init the list of car 
List<Car> cars = //... 

// LAMBDA EXPRESSION 
List<String> names = cars.stream().map(car -> car.getName()).collect(Collectors.toList()); 
+1

ओह लैम्ब्डा, आप सुंदरता! –

+1

@ ईएम-निर्माण वह हालांकि नहीं है ... – aaiezza

0

आम-लिस्प में एक नक्शाकार-कार्य होता है (इसका उपरोक्त कार उदाहरण के साथ कुछ लेना देना नहीं है)। जावा में एक सामान्य mapcar-समारोह:

static <LIST_TYPE, ELEM_TYPE> List<LIST_TYPE> mapcar(Collection<ELEM_TYPE> list, Function<ELEM_TYPE, LIST_TYPE> function) 
{ 
    return list.stream().map(function).collect(Collectors.toList()); 
} 

कार-उदाहरण के लिए:

List<String> carNames = mapcar(cars, car -> car.getName()); 
संबंधित मुद्दे

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