簡體   English   中英

如何從對象的ArrayList獲取屬性列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM