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)