と仮定私はのように見えるオブジェクトを持っている:のArrayListからのオブジェクトの属性のリストを取得する方法
public class Obj {
String foo;
String bar;
}
私はタイプOBJのArrayListのを作成し、それを移入した場合、私はのリストを返すことができる方法がありますArrayListの配列のfoo属性にあるすべてのオブジェクトは?
編集:私はより明確にされている必要があり、私は、リストを反復
と仮定私はのように見えるオブジェクトを持っている:のArrayListからのオブジェクトの属性のリストを取得する方法
public class Obj {
String foo;
String bar;
}
私はタイプOBJのArrayListのを作成し、それを移入した場合、私はのリストを返すことができる方法がありますArrayListの配列のfoo属性にあるすべてのオブジェクトは?
編集:私はより明確にされている必要があり、私は、リストを反復
List<String> foos = new ArrayList<String>();
for (Obj obj : objs) {
foos.add(obj.foo)
}
またはJava 8のため以降、使用は、ストリーム:
objs.stream().map(o -> o.foo).collect(toList());
反復を経て、これを行うと、すべてのfooプロパティのセットを作成したくありませんでした。あなたのList<Obj>
を反復処理し、新しいList
例えばへのfooのエントリを照合する必要があります
このような何か? Guavaを使用して
List<String> foos = new ArrayList<String>();
for (Obj obj : objList)
{
foos.addElement(obj.foo);
}
あなたはこのような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);
@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();
}
});
リスト OBJSを持っているとのfoo属性が含まれているリストから2番目のリストを作成したいですobjからすべてのObjのうちのどれか? –
Ralph