假设我有一个看起来像这样的对象:
public class Obj {
String foo;
String bar;
}
如果我创建一个Obj类型的arraylist并填充它,有没有办法可以从ArrayList返回数组foo属性中所有对象的列表?
编辑:我应该更清楚,我不想通过迭代来做到这一点
答案 0 :(得分:10)
试试这个:
Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName"));
使用apache commons collection api。
答案 1 :(得分:7)
您必须遍历List<Obj>
并将foo条目整理为新的List
e.g。
List<String> foos = new ArrayList<String>();
for (Obj obj : objs) {
foos.add(obj.foo)
}
或Java 8及更高版本,因此使用流:
objs.stream().map(o -> o.foo).collect(toList());
答案 2 :(得分:4)
使用Guava,您可以使用Lists.transform创建foo
中对象的List
属性的视图,如下所示:
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);
答案 3 :(得分:1)
@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&gt; = 4,它支持类型安全的泛型。
以下是Apache Collections版本的较少类型安全版本&lt; 4,不使用泛型:
Collection values = CollectionUtils.collect(messages, new Transformer(){
@Override
public Object transform(Object input) {
Obj obj = (Obj) input;
return obj.getFoo();
}
});
答案 4 :(得分:0)
遍历列表并创建一组所有foo属性。
答案 5 :(得分:0)
这样的事情?
List<String> foos = new ArrayList<String>();
for (Obj obj : objList )
{
foos.addElement(obj.foo);
}