如何从对象的ArrayList获取属性列表

时间:2011-01-26 17:04:06

标签: java arraylist

假设我有一个看起来像这样的对象:

public class Obj {
String foo;
String bar;
}

如果我创建一个Obj类型的arraylist并填充它,有没有办法可以从ArrayList返回数组foo属性中所有对象的列表?

编辑:我应该更清楚,我不想通过迭代来做到这一点

6 个答案:

答案 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);
}