获取List中对象的属性列表

时间:2011-09-05 14:10:57

标签: java class list collections

如果有List<Person>,是否有可能从中获取所有person.getName()的列表? 是否有一个准备好的调用,或者我必须写一个foreach循环,如:

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

8 个答案:

答案 0 :(得分:69)

Java 8及以上版本:

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

如果您需要确保获得ArrayList,则必须将最后一行更改为:

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

Java 7及以下版本:

Java 8之前的标准集合API不支持此类转换。你必须编写一个循环(或将它包装在你自己的某个“map”函数中),除非你转向一些更高级的集合API /扩展。

(Java片段中的行正好是我要使用的行。)

在Apache Commons中,您可以使用CollectionUtils.collectTransformer

在Guava中,您可以使用Lists.transform方法。

答案 1 :(得分:9)

你可能已经这样做但是对其他人来说

使用Java 1.8

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

答案 2 :(得分:6)

试试这个

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

使用apache commons collection api。

答案 3 :(得分:2)

我认为你总是需要这样做。但是,如果你总是需要这样的东西,那么我建议你创建另一个类,例如调用它People,其中personList是一个变量。

这样的事情:

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
    }
}

在这种情况下,您每次只需要调用一个getter。

答案 4 :(得分:2)

未经测试,但这是个主意:

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);
    }
}

答案 5 :(得分:1)

看一下http://code.google.com/p/lambdaj/ - Java有LINQ等价物。使用它不会避免迭代所有项目,但代码会更加压缩。

答案 6 :(得分:0)

您必须遍历并访问每个对象getName()

也许guava可以做一些奇特的事......

答案 7 :(得分:0)

在Java中没有其他方法可以做到这一点,至少只要你坚持使用标准的Java Collection API。

我一直希望这样的东西很长一段时间......特别是因为我尝到了Ruby的甜蜜自由,它有很棒的东西,如收集和选择使用闭合。