2011-01-26 29 views
7

と仮定私はのように見えるオブジェクトを持っている:のArrayListからのオブジェクトの属性のリストを取得する方法

public class Obj { 
String foo; 
String bar; 
} 

私はタイプOBJのArrayListのを作成し、それを移入した場合、私はのリストを返すことができる方法がありますArrayListの配列のfoo属性にあるすべてのオブジェクトは?

編集:私はより明確にされている必要があり、私は、リストを反復

+0

リスト OBJSを持っているとのfoo属性が含まれているリストから2番目のリストを作成したいですobjからすべてのObjのうちのどれか? – Ralph

答えて

7

List<String> foos = new ArrayList<String>(); 
for (Obj obj : objs) { 
    foos.add(obj.foo) 
} 

またはJava 8のため以降、使用は、ストリーム:

objs.stream().map(o -> o.foo).collect(toList()); 
+3

私の最初のバージョンはこれでした: 'var foos = objs.Select(x => x.foo);'私はそれがJavaの質問であることに気付きました。あなたは 'LINQ'よ、良かった! –

+0

Guavaのようなものを使って普通のJavaで 'map'と同等のことをすることができます。明らかにもっと多くの作業が必要ですが、元のリストのすべての 'foo'値のコピーにメモリを割り当てることに比べて利点があります。 – ColinD

+1

Java 8 Lambdaはこれに新しい賢さを提供しますか? Ala the scala-LINQトリッキー。 – ken

0

反復を経て、これを行うと、すべてのfooプロパティのセットを作成したくありませんでした。あなたのList<Obj>を反復処理し、新しいList

例えばへのfooのエントリを照合する必要があります

0

このような何か? Guavaを使用して

List<String> foos = new ArrayList<String>(); 
for (Obj obj : objList) 
{ 
    foos.addElement(obj.foo); 
} 
4

あなたはこのようなLists.transformを使用してList内のオブジェクトのfooプロパティのビューを作成することができます。他のソリューションとは異なり

public class Obj { 
    String foo; 
    String bar; 

    public static final Function<Obj, String> FOO = new Function<Obj, String>() { 
    public String apply(Obj input) { 
     return input.foo; 
    } 
    }; 
} 

public void someMethod(List<Obj> objs) { 
    List<String> foos = Lists.transform(objs, Obj.FOO); 
    ... 
} 

を、これは純粋にList<Obj>ビューありますしたがって、ArrayListまたはそのようなものをメモリに割り振らず、List<Obj>のサイズに関係なく、ほとんど時間のない時点で作成することができます。さらに、元のList<Obj>を変更すると、foosリストにその変更が反映されます。

Java 8では(これはいつか2012年に予定されています)、これはラムダ式とメソッド参照で非常に簡単になります。あなたはこのような何かを行うことができます:

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

使用のApache CommonsのコレクションAPI:

List<Obj> objs = ... 
List<String> foos = objs.map(#Obj.getFoo); 
10

はこれを試してみてください。

+0

ありがとう、この方法は簡単で迅速です – Vito

1

@Surodipの答えは、Apache Commons Collectionsに基づくコンパクトなソリューションを使用しています。 しかし、そのソリューションはTransfomerは、文字列式を経由してプロパティを参照するので、タイプセーフではありません。ここでTransformerUtils.invokerTransformer("getName")

はより冗長ですが、Apacheのコモンズコレクションを使用したタイプセーフな解決策:

Collection<String> values = CollectionUtils.collect(messages, new Transformer<Obj, String>(){ 

      @Override 
      public String transform(Obj input) { 
       return input.getFoo(); 
      } 

     }); 

上記の解決策は、Apache Commonsのを使用していますコレクションのバージョン> = 4、タイプセーフティのジェネリックをサポートしています。以下は

ジェネリックを使用していないApacheのコレクションバージョン< 4、にはあまりタイプセーフバージョンです:

Collection values = CollectionUtils.collect(messages, new Transformer(){ 

      @Override 
      public Object transform(Object input) { 
       Obj obj = (Obj) input; 
       return obj.getFoo(); 
      } 

     }); 
関連する問題