2011-09-05 20 views
19

List<Person>がある場合、すべてのリストがperson.getName()になっている可能性がありますか? はそのための準備呼び出しがあり、または私のようなforeachループ記述する必要がありません。上記のリスト内のオブジェクトの属性のリストを取得

List<Person> personList = new ArrayList<Person>(); 
List<String> namesList = new ArrayList<String>(); 
for(Person person : personList){ 
    namesList.add(personList.getName()); 
} 

答えて

48

のJava 8とを:あなたはあなたが得ることを確認する必要がある場合は

List<String> namesList = personList.stream() 
            .map(Person::getName) 
            .collect(Collectors.toList()); 

ArrayList結果として、あなたが最後の行を変更する必要があります。

        ... 
            .collect(Collectors.toCollection(ArrayList::new)); 

Java 7以下:

Java 8より前の標準コレクションAPIでは、このような変換はサポートされていません。いくつかの好きなコレクションのAPI /拡張機能に目を通さない限り、ループを書く必要があります(または、あなた自身のマップ機能でラップする必要があります)。

(あなたのJavaスニペットの行は、私が使用することになり、正確に線です。)のApache Commonsので

、あなたはグアバでCollectionUtils.collectTransformer

を使用することができ、あなたがLists.transformメソッドを使用することができます。

0

各オブジェクトgetName()をループスルーしてアクセスする必要があります。

たぶんguavaは空想何かを行うことができます...

+0

を使用して他の人

のためにあなたはグアバとの例を提供することはできますか? – Sonnenhut

0

少なくとも限り、あなたは、標準のJavaコレクションAPIにこだわっているように、あなたが示唆したものよりもJavaでこれを行うには他に方法はありません。

私はこのようなことを長い間望んでいます...特に、私はRubyの甘い自由を味わいました。

1

http://code.google.com/p/lambdaj/を見てください - JavaのLINQに相当します。それを使用すると、アイテム全体を反復することは避けられますが、コードはより圧縮されます。

+1

これがJava 8に含まれるのだろうかと思います。 –

2

いつもそうする必要があると思います。しかし、いつもそういうことが必要なら、別のクラスを作ることを提案します。たとえば、Peopleとします。ここで、personListは変数です。このような

何か:

class People{ 
    List<Person> personList; 
    //Getters and Setters 

    //Special getters 
    public List<string> getPeopleNames(){ 
     //implement your method here   
    } 

    public List<Long> getPeopleAges(){ 
     //get all people ages here 
    } 
} 

この場合、あなたが唯一のたびに1つのゲッターを呼び出す必要があります。

2

テストしたが、これはアイデアではありません:

public static <T, Q> List<T> getAttributeList(List list, Class<? extends Q> clazz, String attribute)  
{ 
    List<T> attrList= new ArrayList<T>(); 

    attribute = attribute.charAt(0).toUpperCase() + attribute.substring(1); 
    String methodName = "get"+attribute; 

    for(Object obj: personList){ 
     T aux = (T)clazz.getDeclaredMethod(methodName, new Class[0]).invoke(obj, new Object[0]); 
     attrList.add(aux); 
    } 
} 
5

この

Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName")); 

使用のApache CommonsのコレクションAPIを試してみてください。

6

あなたはこれを実行している場合がありますが、Java 1.8

List<String> namesList = personList.stream().map(p -> p.getName()).collect(Collectors.toList());