Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList获取对象属性的所有值_Java_Arraylist - Fatal编程技术网

Java ArrayList获取对象属性的所有值

Java ArrayList获取对象属性的所有值,java,arraylist,Java,Arraylist,假设我有一个对象用户的ArrayList,所以ArrayList。用户对象具有属性userID 与其自己迭代列表并将userid添加到一个单独的列表中,是否存在一个API调用,我可以在其中传递该对象上所需的属性,并将这些属性的列表返回给我?浏览了一下API,没有什么突出的地方 在Java 7或中寻找解决方案听起来像是要使用映射 映射使用一对键和值。您可以将userID指定为键,将实际的user对象指定为值 听起来你想使用地图 映射使用一对键和值。您可以将userID指定为键,将实际的user对象

假设我有一个对象用户的ArrayList,所以
ArrayList
。用户对象具有属性
userID

与其自己迭代列表并将userid添加到一个单独的列表中,是否存在一个API调用,我可以在其中传递该对象上所需的属性,并将这些属性的列表返回给我?浏览了一下API,没有什么突出的地方


在Java 7或中寻找解决方案听起来像是要使用
映射

映射使用一对
键和值。您可以将
userID
指定为键,将实际的
user
对象指定为值


听起来你想使用
地图

映射使用一对
键和值。您可以将
userID
指定为键,将实际的
user
对象指定为值

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

片段


使用反射的最丑陋解决方案:

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;
      }
}
您可以使用(Java 8)执行此操作:

片段


使用反射的最丑陋解决方案:

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;
      }
}
你可以用番石榴的方法得到同样的结果

List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer> (){
                            public Integer apply(User user) {
                                   return user.getUserID();
                            }
                        });
List userid=Collections2.transform(用户,新函数(){
公共整数应用(用户){
返回user.getUserID();
}
});
Guava支持Java7和更低版本,因此,如果您想使用外部库,上述内容将适用于您的情况

不幸的是,您将不得不对任何其他对象及其内部字段执行类似的逻辑。它不像反射法那样是一种通用的解决方案,它只是一种更紧凑的解决方案。

您可以使用番石榴的方法来获得相同的结果

List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer> (){
                            public Integer apply(User user) {
                                   return user.getUserID();
                            }
                        });
List userid=Collections2.transform(用户,新函数(){
公共整数应用(用户){
返回user.getUserID();
}
});
Guava支持Java7和更低版本,因此,如果您想使用外部库,上述内容将适用于您的情况


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

True,唯一的问题是对象是使用Jackson从json映射而来的,所以我们希望代码能简单一点。比哈希映射更简单?我真的不知道你当时在期待什么。实现起来非常简单。我认为你没有抓住要点。杰克逊很容易解析出一个列表。解析成映射会增加代码的复杂性。没错,唯一的问题是对象是使用Jackson从json映射而来的,所以我们希望代码简单一点。比哈希映射简单一点?我真的不知道你当时在期待什么。实现起来非常简单。我认为你没有抓住要点。杰克逊很容易解析出一个列表。解析成映射会增加代码的复杂性。有趣的是,不幸的是,我们没有运行8,但很高兴知道它即将到来。Java 7或@Michael No.有什么解决方案吗?但是您想构建一个可以返回一个字段列表的方法吗?类似于
List-get(List-l,String-fieldName)
?@Michael我添加了一个使用反射的解决方案。您可以为所有用户获取所需属性的列表,只需提供要收集数据的字段的正确名称。请注意,我不太喜欢这个解决方案。有趣的是,不幸的是,我们没有运行8,但很高兴知道它即将到来。Java 7或@Michael No有任何解决方案。但是您想构建一个可以返回一个字段列表的方法吗?类似于
List-get(List-l,String-fieldName)
?@Michael我添加了一个使用反射的解决方案。您可以为所有用户获取所需属性的列表,只需提供要收集数据的字段的正确名称。请注意,我不是这个解决方案的粉丝。
List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer> (){
                            public Integer apply(User user) {
                                   return user.getUserID();
                            }
                        });