Как получить список атрибутов из ArrayList объектов - PullRequest
7 голосов
/ 26 января 2011

Предположим, у меня есть объект, который выглядит следующим образом:

public class Obj {
String foo;
String bar;
}

Если я создаю массив списков типа Obj и заполняю его, есть ли способ вернуть список всех объектов в атрибуте foo массива из ArrayList?

РЕДАКТИРОВАТЬ: Я должен был быть более ясным, я не хотел делать это с помощью итерации

Ответы [ 6 ]

10 голосов
/ 22 ноября 2013

Попробуйте это:

Collection<String> names = CollectionUtils.collect(personList, TransformerUtils.invokerTransformer("getName"));  

Используйте apache commons collection api.

7 голосов
/ 26 января 2011

Вам придется перебирать ваш 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());
4 голосов
/ 26 января 2011

Используя Guava , вы можете создать представление свойства foo объектов в List, используя Lists.transform , например:

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 году) это станет намного проще с лямбда-выражениями и ссылками на методы.Вы сможете сделать что-то вроде этого:

List<Obj> objs = ...
List<String> foos = objs.map(#Obj.getFoo);
1 голос
/ 01 июня 2015

В ответе @Surodip используется компактное решение на основе Apache Commons Collections . Но это решение не является безопасным с точки зрения типов, поскольку Transfomer ссылается на свойство через строковое выражение: TransformerUtils.invokerTransformer("getName")

Вот более подробное, но безопасное решение с использованием коллекций Apache Commons:

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, в которой не используются обобщенные значения: </p>

Collection values = CollectionUtils.collect(messages, new Transformer(){

            @Override
            public Object transform(Object input) {
                Obj obj = (Obj) input;
                return obj.getFoo();
            }

        });
0 голосов
/ 26 января 2011

как то так?

List<String> foos = new ArrayList<String>();
for (Obj obj : objList )
{
    foos.addElement(obj.foo);
}
0 голосов
/ 26 января 2011

Итерация по списку и создание набора всех свойств foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...