2011-08-28 60 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()); 
相关问题