Get list of attributes of an object in an List

2019-03-09 00:45发布

When there is an List<Person>, is there a possibility of getting List of all person.getName() out of that? Is there an prepared call for that, or do I have to write an foreach loop like:

List<Person> personList = new ArrayList<Person>();
List<String> namesList = new ArrayList<String>();
for(Person person : personList){
    namesList.add(personList.getName());
}

8条回答
不美不萌又怎样
2楼-- · 2019-03-09 01:10

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

Maybe guava can do something fancy ...

查看更多
We Are One
3楼-- · 2019-03-09 01:14

Try this

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

Use apache commons collection api.

查看更多
倾城 Initia
4楼-- · 2019-03-09 01:16

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.

查看更多
老娘就宠你
5楼-- · 2019-03-09 01:21

take a look at http://code.google.com/p/lambdaj/ - there is LINQ equivalent for Java. Using it won't avoid iterating all over items but the code would be more compressed.

查看更多
闹够了就滚
6楼-- · 2019-03-09 01:23

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.

查看更多
倾城 Initia
7楼-- · 2019-03-09 01:25

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);
    }
}
查看更多
登录 后发表回答