ArrayList获取对象属性的所有值

时间:2013-12-03 18:09:50

标签: java arraylist

假设我有一个对象用户的ArrayList ArrayList<user>。 User对象具有属性userID

而不是自己迭代列表并将userID添加到单独的列表中,是否有API调用,我可以在其中传递我想要的属性,并将这些属性的列表返回给我?看看API并没有什么突出的。

在Java 7或&lt;中寻找解决方案。

3 个答案:

答案 0 :(得分:5)

您可以使用lambdas expressions(Java 8)执行此操作:

import java.util.*;
import java.util.function.*;
import java.util.stream.*;

public class Test {
  public static void main(String args[]){
    List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave"));
    List<Long> listUsersId = users.stream()
                                  .map(u -> u.id)
                                  .collect(Collectors.toList());
    System.out.println(listUsersId);
  }
}

class User {
  public long id;
  public String name;

  public User(long id, String name){
    this.id = id;
    this.name = name;
  }
}

输出:

[1, 2, 3, 4]

代码段here

<小时/> 使用反射的最丑的解决方案:

public class Test {
    public static void main (String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
         List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave"));
         List<Object> list = get(users,"id");
         System.out.println(list);
    }

    public static List<Object> get(List<User> l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
        Field field = User.class.getDeclaredField(fieldName);
        field.setAccessible(true);
        List<Object> list = new ArrayList<>();
        for(User u : l){
            list.add(field.get(u));
        }
        field.setAccessible(false);
        return list;
    }
}
class User {
      private long id;
      private String name;

      public User(long id, String name){
        this.id = id;
        this.name = name;
      }
}

输出:

[1, 2, 3, 4]

答案 1 :(得分:1)

您可以使用Guava的Collections2#transform方法获得相同的结果。

List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer> (){
                            public Integer apply(User user) {
                                   return user.getUserID();
                            }
                        });

Guava支持Java 7及更低版本,因此如果您想使用外部库,上述内容将适用于您的情况。

不幸的是,您必须为任何其他对象及其可能具有的内部字段执行类似的逻辑。它不像反射那样通用的解决方案,它只是一个更紧凑的解决方案。

答案 2 :(得分:0)

听起来你想使用Map

地图使用Key, Value对。您可以将userID指定为关键字,将实际user对象指定为值。

You can read more here