2011-08-28 15 views
23

Załóżmy, że mam listę samochodów:Jak mogę wywołać metodę na każdym elemencie listy?

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()); 
} 

Jak mogę skrócić powyższy kod? Krótko mówiąc, jak mogę wywołać metodę na każdym elemencie listy?

Na przykład w Pythonie:

[car.name for car in cars] 

Odpowiedz

17

UPDATE:

See scribaniwannabe na answer dla Java 8 roztworu za pomocą wyrażenia lambda.

Oryginalna pre-Java 8 odpowiedź:

Efekt można osiągnąć z guawy, realizacja Function jest już bardziej gadatliwy niż to, co masz:

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); 

(Należy pamiętać, że Lists.transform zwraca widok, który zastosuje funkcję leniwie - jeśli chcesz mieć natychmiastową kopię, musisz skopiować zwróconą listę do nowej listy.)

To robi nie pomoże ci skrócić kodu, ale jest to przykład tego, jak bardzo jest to pożądane w Javie.

Edit: Możecie rzucić okiem na lambdaj, biblioteka, która wydaje się zbliżać, co szukasz. Nie próbowałem tego na sobie, ale strona przedstawia poniższy przykład:

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

inny niż pozbycie zaczepów i/lub ruchome cały kod do jednej linii, co może nie być dobrym pomysłem, nie można.

38

Java 8 będzie (miejmy nadzieję) mieć jakąś formę wyrażenia lambda, co sprawi, że kod taki będzie bardziej wykonalny. (Niezależnie od tego, czy będzie coś podobnego do listy, to inna sprawa.)

Twoje życzenie zostało spełnione!

--- EDIT ---
lol jakby na zawołanie: forEach()

pewno to sprawdzić.

za pytanie konkretnie, staje się w następujące:

// 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())); 

To naprawdę niesamowite co zrobili tutaj. Jestem podekscytowany widząc to w przyszłości.

--- EDYTUJ ---
Powinienem był to wcześniej zobaczyć, ale nie mogę się oprzeć, ale o tym napisać.

Funkcja strumienia dodana w jdk8 pozwala na map method.

+1

Oh lambda, jesteś piękna! –

+1

@ EM-Creations Czy ona nie jest ... – aaiezza

0

W typowym seplenienie występuje funkcja mapcar (nie ma to nic wspólnego z samochodem - przykład powyżej). Ogólny mapcar funkcja w Javie:

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()); 
} 

dla samochodu-przykład:

List<String> carNames = mapcar(cars, car -> car.getName()); 
Powiązane problemy