如何在List的每个元素上调用方法?

San*_*nda 38 java list-comprehension list

假设我有一个汽车列表:

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

    public Car() { // ...  }

    public getName() { return name; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)
// 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());
}
Run Code Online (Sandbox Code Playgroud)

如何缩短上面的代码?简而言之,如何在List的每个元素上调用方法?

例如,在Python中:

[car.name for car in cars]
Run Code Online (Sandbox Code Playgroud)

aai*_*zza 67

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()) );
Run Code Online (Sandbox Code Playgroud)

他们在这里所做的真的很令人难以置信.我很高兴看到将来使用它.

---编辑---
我应该早点看到这个,但我无法抗拒,只能发布它.

jdk8中添加的Stream功能允许使用map方法.

// 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() );
Run Code Online (Sandbox Code Playgroud)


Pau*_*ora 22

更新:

有关使用lambda表达式的Java 8解决方案,请参阅aaiezza的答案.

原来的Java前8答案:

使用Guava可以实现效果,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);
Run Code Online (Sandbox Code Playgroud)

(请记住,Lists.transform返回一个将懒惰地应用该函数的视图 - 如果您想要立即复制,则需要将返回的列表复制到新列表中.)

所以这并没有帮助你缩短你的代码,但它是一个例子,说明在Java中实现你想要的影响是多么冗长.

编辑:你可能会看看lambdaj,一个似乎接近你正在寻找的库.我自己没试过,但主页显示了这个例子:

List<Person> personInFamily = asList(new Person("Domenico"), new Person("Mario"), new Person("Irma"));
forEach(personInFamily).setLastName("Fusco");
Run Code Online (Sandbox Code Playgroud)