2011-08-28 57 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()); 
} 

我怎樣才能縮短上面的代碼?簡而言之,如何在列表的每個元素上調用方法?

例如,在Python:

[car.name for car in cars] 

回答

17

UPDATE:

見scribaniwannabe用於使用lambda表達式一個Java 8溶液的answer

原始前的Java 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返回一個將延遲應用函數的視圖 - 如果您想要立即複製,則需要將返回的列表複製到新列表中。)

因此,這樣做不能幫助你縮短代碼,但是它是在Java中實現你想要的影響的詳細例子。

編輯:你可能會看看lambdaj,這個庫似乎接近你正在尋找的東西。我還沒有嘗試過這一點我自己,但網頁顯示了這個例子:

List<Person> personInFamily = asList(new Person("Domenico"), new Person("Mario"), new Person("Irma")); 
forEach(personInFamily).setLastName("Fusco"); 
2
比擺脫括號和/或移動的所有代碼一條線,這可能不是一個好主意,你不能等

38

的Java 8將(希望)具有某種形式的lambda表達式,這將使這樣的代碼更加可行。 (是否會有任何類似列表解析是另一回事。)

您的願望已被授予!

---編輯---
笑,彷彿在暗示:forEach()

肯定檢查了這一點。

對於你的問題而言,就變成了如下因素:

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

這真的很不可思議,他們已經在這裏做了什麼。我很高興看到這將在未來使用。

---編輯---
我應該早點看到這個,但我無法抗拒,只能張貼它。

在jdk8中添加的流功能允許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

@ EM-Creations是不是她雖然... – aaiezza

0

在common-lisp中有一個mapcar函數(這與上面的car-example沒有關係)。 一般mapcar功能在Java中:

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()); 
相關問題