Java 如何根据对象的属性从对象列表中提取值?

Java 如何根据对象的属性从对象列表中提取值?,java,list,collections,Java,List,Collections,我想在列表中查找具有特定属性的对象 例如,假设我有一个此类对象的列表: class Person { private String name; private String id; } 我知道我可以通过以下方式获取列表中所有人的姓名: Collection<String> names = CollectionUtils.collect( personList, TransformerUtils.invokerTransformer("getName"

我想在列表中查找具有特定属性的对象

例如,假设我有一个此类对象的列表:

class Person {
    private String name;
    private String id;
}
我知道我可以通过以下方式获取列表中所有人的姓名:

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

但我想做的是得到一个
对象的列表,这些对象的名称是,例如,
“Nick”
。我没有Java 8。

如果您不想使用Java 8流,只需在列表中循环并手动检查元素:

ArrayList<Person> filteredList = new ArrayList<Person>();

for(Person person : personList) {
    if(person.getName().equals("Nick")) filteredList.add(person);
}
ArrayList filteredList=new ArrayList();
for(个人:个人列表){
if(person.getName().equals(“Nick”))filteredList.add(person);
}

我看到您正在使用Apache Common UTIL,那么您可以使用:

CollectionUtils.filter( personList, new Predicate<Person>() {
    @Override
    public boolean evaluate( Person p ) {
        return p.getName() != null && p.getName().equals( "Nick" );
    }
});
CollectionUtils.filter(personList,new Predicate()){
@凌驾
公共布尔求值(人p){
返回p.getName()!=null和p.getName().equals(“尼克”);
}
});

使用Apache collection utils(您已经在使用),您可以使用
filter
方法创建集合的子集,该子集由与给定筛选器匹配的项组成,并结合基于
Transformer
transformedPredicate
匹配“Nick”的
谓词:

CollectionUtils.filter(names, PredicateUtils.transformedPredicate(
    TransformerUtils.invokerTransformer("getName"), PredicateUtils.equalPredicate("Nick")));
也就是说,在迁移到Java8之前,您可能需要重新考虑使用这种功能强大的方法。迁移之后,不仅会有大量冗余的Apache集合代码,而且在引入闭包和lambda之前的解决方案往往比较冗长,并且通常比命令式替代方案可读性较差


注意:这将修改现有的集合。如果这不是所需的行为,则需要在调用filter方法之前创建一个副本。

您可以尝试使用HashMap

HashMap<String, Integer> points = new HashMap<String, Integer>();
    points.put("Amy", 154);
    points.put("Dave", 42);
    points.put("Rob", 733);
    System.out.println(points.get("Dave")); 
HashMap points=newhashmap();
点数。put(“艾米”,154);
得分。把(“戴夫”,42);
积分。put(“Rob”,733);
System.out.println(points.get(“Dave”);

这只是一个示例,但是您可以检查,而不是使用字符串Integer,您可以尝试使用Integer、String和
if语句。不过这只是一个想法。

我正在考虑,您可能有一个具有此属性名称的不同对象的集合。为此,我建议您对这些组件执行parent,并使用泛型对其执行搜索:

例如:

父类Name.java

public class Name {

    private String name;

    public Name(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
类Pet.java

public class Pet extends Name{

    public Pet(String name) {
        super(name);
    }

}
和类Person.java

public class Person extends Name{

    public Person(String name) {
        super(name);
    }

}
不具有以下属性的作业类:

public class Job {

    private String description;

    public Job(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}
这样,您就可以检查它的实例并比较所需内容:

public static void main(String ... args) {
    List<Object> objectList = new ArrayList();
    objectList.add(new Person("Nick"));
    objectList.add(new Person("Nik"));
    objectList.add(new Person("Nikc"));
    objectList.add(new Person("Ncik"));
    objectList.add(new Pet("Nick"));
    objectList.add(new Pet("Nik"));
    objectList.add(new Pet("Nikc"));
    objectList.add(new Pet("Ncik"));
    objectList.add(new Job("Nick"));
    objectList.add(new Job("Nik"));
    objectList.add(new Job("Nikc"));
    objectList.add(new Job("Ncik"));

    for (Object o : extractObjectsMatching("Nick", objectList)){
        System.out.println(((Name) o).getName());
    }
}

public static List<Object> extractObjectsMatching(String name, List<Object> objectList){
    List<Object> matches = new ArrayList<>();
    for (Object e : objectList){
        if (e instanceof Name && ((Name) e).getName().contains(name)){
            matches.add(e);
        }
    }

    return matches;
}
publicstaticvoidmain(字符串…参数){
List objectList=new ArrayList();
添加(新的人(“尼克”));
添加(新人员(“Nik”);
添加(新人员(“Nikc”);
对象列表。添加(新人员(“Ncik”);
添加(新宠物(“尼克”));
添加(新宠物(“Nik”);
添加(新宠物(“Nikc”);
添加(新宠物(“Ncik”);
objectList.add(新工作(“尼克”));
objectList.add(新作业(“Nik”));
objectList.add(新作业(“Nikc”);
添加(新作业(“Ncik”);
用于(对象o:extractObjectsMatching(“尼克”,对象列表)){
System.out.println(((Name)o.getName());
}
}
公共静态列表ExtractObjectsMatch(字符串名称,列表objectList){
列表匹配项=新的ArrayList();
for(对象e:对象列表){
if(e instanceof Name&((Name)e).getName()包含(Name)){
添加(e);
}
}
返回比赛;
}

如果对象类不是Name的实例,则意味着该类将不具有您要查找的属性,只需忽略,否则,请与您要检索并存储的信息进行比较。

简单地遍历列表并检查每个名称有什么错?使用for语句迭代列表,内部检查名称是否等于'Nick',如果是,则将对象添加到另一个listfor循环,以及语句是否始终存在。如果使用java 8流式API中的过滤器,则性能会更好,但可能不如for外观。类似于
List nicks=personList.stream.filter(person->“Nick.equals”(person.getName()).collect(Collectors.toList())
当您可以简单地遍历列表并检查是否有语句显示名称为“Nick”时,为什么要使用集合来执行此操作。
返回“Nick.equals”(p.getName());
ApacheCollection utils提供了将Transformer转换为谓词的方法,因此不需要匿名类(假设OP愿意使用reflect,如代码示例所示)@svasa非常感谢。您的代码似乎删除了所有结果,而不仅仅是我想要提取的结果。它应该可以工作,尽管可能存在错误(我没有尝试).你能发布一个SSCCE显示它不起作用吗?当然可以。我过一会儿再发布。我确实知道它不起作用的原因。你的代码绝对正确。非常感谢。投票通过。