2011-08-28 22 views
23

は、私は車のリストがあるとします。Listの各要素に対してメソッドを呼び出すにはどうすればよいですか?

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

私は上記のコードを短くすることができますどのように?簡単に言えば、Listの各要素に対してメソッドを呼び出すにはどうすればよいですか? Pythonで例えば

、:

、することはできません良いアイデアではないかもしれませんブレースおよび/または1つの行にすべてのコードを移動し、退治以外の
[car.name for car in cars] 

答えて

17

UPDATE:

scribaniwannabeのanswerラムダ式を使用してJava 8ソリューションについてを参照してください。

オリジナル前の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ことを覚えておいてくださいlazily関数を適用するビューを返します。即時コピーが必要な場合は、返されたリストを新しいリストにコピーする必要があります)。

あなたのコードを短くするのに役立つわけではありませんが、それはJavaであなたが望む効果を達成するためにどのくらい冗長であるかの例です。

編集:あなたが探しているものに近づいているような図書館のをご覧ください。私は自分自身を、これを試していませんが、ホームページには、この例を示します。

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

は、Java 8は(うまくいけば)ラムダ式の何らかの形を持っているので、このようなコードをより実現可能にします。 (リスト内包のようなものがあるかどうかは別の問題です)

あなたの希望は認められました!

--- EDIT ---
笑合図にいるかのように:

forEach()は間違いなくこれをチェックしてください。あなたの質問のために

は具体的には、folowing次のようになります。

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

それは本当に彼らがここで何をやったかはかなり信じられないほどです。私はこれが将来使用されるのを見ることに興奮しています。

--- EDIT ---
私はこれをもっと早く見たはずですが、私はそれに抵抗することはできませんが、投稿してください。

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-function(これは上記の車の例とは関係ありません)があります。 Javaで一般的でmapcar機能:車-例えば

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()); 
関連する問題