Get list of attributes of an object in an List

前端 未结 8 1715
青春惊慌失措
青春惊慌失措 2020-12-12 19:12

When there is an List, is there a possibility of getting List of all person.getName() out of that? Is there an prepared call for that

相关标签:
8条回答
  • 2020-12-12 19:26

    You might have done this but for others

    using Java 1.8

    List<String> namesList = personList.stream().map(p -> p.getName()).collect(Collectors.toList()); 
    
    0 讨论(0)
  • 2020-12-12 19:27

    Java 8 and above:

    List<String> namesList = personList.stream()
                                       .map(Person::getName)
                                       .collect(Collectors.toList());
    

    If you need to make sure you get an ArrayList as a result, you have to change the last line to:

                                        ...
                                        .collect(Collectors.toCollection(ArrayList::new));
    

    Java 7 and below:

    The standard collection API prior to Java 8 has no support for such transformation. You'll have to write a loop (or wrap it in some "map" function of your own), unless you turn to some fancier collection API / extension.

    (The lines in your Java snippet are exactly the lines I would use.)

    In Apache Commons, you could use CollectionUtils.collect and a Transformer

    In Guava, you could use the Lists.transform method.

    0 讨论(0)
  • 2020-12-12 19:27

    There is no other way to do this in Java than the one you suggested, at least as long as you are sticking with the standard Java Collection API.

    I have been wishing for something like this for a long time... Especially since I tasted the sweet freedom of Ruby, which has wonderful things like collect and select working with closures.

    0 讨论(0)
  • 2020-12-12 19:28

    Not tested but this is the idea:

    public static <T, Q> List<T> getAttributeList(List list, Class<? extends Q> clazz, String  attribute)    
    {
        List<T> attrList= new ArrayList<T>();
    
        attribute = attribute.charAt(0).toUpperCase() + attribute.substring(1); 
        String methodName = "get"+attribute;
    
        for(Object obj: personList){
            T aux = (T)clazz.getDeclaredMethod(methodName, new Class[0]).invoke(obj, new Object[0]);
            attrList.add(aux);
        }
    }
    
    0 讨论(0)
  • 2020-12-12 19:35

    I think you will always need to do that. But if you will always need such things, then I would suggest to make another class, for example call it People where personList is a variable.

    Something like this:

    class People{
        List<Person> personList;
        //Getters and Setters
    
        //Special getters
        public List<string> getPeopleNames(){
             //implement your method here        
        }
    
        public List<Long> getPeopleAges(){
             //get all people ages here
        }
    }
    

    In this case you will need to call one getter only each time.

    0 讨论(0)
  • 2020-12-12 19:40

    You will have to loop through and access each objects getName().

    Maybe guava can do something fancy ...

    0 讨论(0)
提交回复
热议问题