![](/img/trans.png)
[英]How to get a list of objects with same objects property from an ArrayList by
[英]How to Get attributes list from ArrayList of objects
假設我有一個看起來像這樣的對象:
public class Obj {
String foo;
String bar;
}
如果我創建一個Obj類型的arraylist並填充它,有沒有辦法可以從ArrayList返回數組foo屬性中所有對象的列表?
編輯:我應該更清楚,我不想通過迭代這樣做
嘗試這個:
Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName"));
使用apache commons collection api。
您必須遍歷List<Obj>
並將foo條目整理到新的List
例如
List<String> foos = new ArrayList<String>();
for (Obj obj : objs) {
foos.add(obj.foo)
}
或者對於Java 8及更高版本,請使用以下流:
objs.stream().map(o -> o.foo).collect(toList());
使用Guava,您可以使用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年到期),使用lambda表達式和方法引用將變得更加容易。 你將能夠做這樣的事情:
List<Obj> objs = ...
List<String> foos = objs.map(#Obj.getFoo);
@Surodip的答案使用基於Apache Commons Collections的緊湊型解決方案。 但該解決方案不是類型安全的,因為Transfomer通過字符串表達式引用該屬性: TransformerUtils.invokerTransformer("getName")
以下是使用Apache Commons Collections的更詳細但類型安全的解決方案:
Collection<String> values = CollectionUtils.collect(messages, new Transformer<Obj, String>(){
@Override
public String transform(Obj input) {
return input.getFoo();
}
});
上述解決方案使用Apache Commons Collection Version> = 4,它支持類型安全的泛型。
以下是Apache Collections Version <4的較少類型安全版本,它不使用泛型:
Collection values = CollectionUtils.collect(messages, new Transformer(){
@Override
public Object transform(Object input) {
Obj obj = (Obj) input;
return obj.getFoo();
}
});
遍歷列表並創建一組所有foo屬性。
這樣的事情?
List<String> foos = new ArrayList<String>();
for (Obj obj : objList )
{
foos.addElement(obj.foo);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.