Java 获取列表中对象的属性列表

Java 获取列表中对象的属性列表,java,class,list,collections,Java,Class,List,Collections,当存在列表时,是否有可能从中获取所有person.getName()的列表? 是否有一个预先准备好的调用,或者我必须编写一个foreach循环,如: List<Person> personList = new ArrayList<Person>(); List<String> namesList = new ArrayList<String>(); for(Person person : personList){ namesList.add

当存在
列表时,是否有可能从中获取所有
person.getName()
的列表? 是否有一个预先准备好的调用,或者我必须编写一个foreach循环,如:

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

Java8及以上版本:

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

Java7及以下版本:

List<String> namesList = personList.stream()
                                   .map(Person::getName)
                                   .collect(Collectors.toList());
Java8之前的标准集合API不支持这种转换。您必须编写一个循环(或将其封装在您自己的某个“映射”函数中),除非您转向更高级的集合API/扩展

(Java代码片段中的行正是我将使用的行。)

在Apache Commons中,您可以使用和


在Guava中,您可以使用该方法。

您必须循环访问每个对象
getName()


也许你可以做一些有趣的事情……

在Java中,除了你建议的方法之外,没有其他方法可以做到这一点,至少只要你坚持使用标准的Java集合API


很长时间以来我一直希望有这样的事情。。。特别是我尝到了Ruby的甜美自由,它有很多美妙的东西,比如使用闭包收集和选择。使用它不会避免对所有项目进行迭代,但代码会更加压缩。

我认为您将始终需要这样做。但是如果您总是需要这些东西,那么我建议创建另一个类,例如称它为
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
    }
}
班级人员{
列出个人名单;
//接球手和接球手
//特殊吸气剂
公共列表getPeopleNames(){
//在这里实现您的方法
}
公共列表getPeopleAges(){
//把所有年龄段的人都带到这里
}
}

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

未经测试,但这就是想法:

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);
    }
}
公共静态列表getAttributeList(列表列表,类试试这个

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

使用apache commons collection api。

如果没有其他api,您可能会这样做

使用Java1.8

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

你能提供一个关于番石榴的例子吗?可读性的提高并没有给我留下深刻的印象。不过,它没有那么详细。我们确实少了50%的字符。“是的”我想?它的性能如何?我也是。我很少认为流API提高了可读性。