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

时间:2016-06-17 23:47:23

标签: java list collections

我想基于具有特定属性的列表中的对象。

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

class Person {
    private String name;
    private String id;
}

我知道我可以使用以下命令获取列表中人员名称的所有

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

但我要做的是获取名称为Person的{​​{1}}个对象的列表。我没有Java 8。

5 个答案:

答案 0 :(得分:6)

我发现您正在使用Apache Common Utils,然后您可以使用:

CollectionUtils.filter( personList, new Predicate<Person>() {
    @Override
    public boolean evaluate( Person p ) {
        return p.getName() != null && p.getName().equals( "Nick" );
    }
});

答案 1 :(得分:3)

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

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

for(Person person : personList) {
    if(person.getName().equals("Nick")) filteredList.add(person);
}

答案 2 :(得分:3)

使用Apache集合工具(您已经在使用),您可以使用filter方法创建集合的子集,其中包含与给定过滤器匹配的项目,并结合Predicate比赛&#34;尼克&#34;根据您的TransformertransformedPredicate

CollectionUtils.filter(names, PredicateUtils.transformedPredicate(
    TransformerUtils.invokerTransformer("getName"), PredicateUtils.equalPredicate("Nick")));

也就是说,在迁移到Java 8之前,您可能需要重新考虑使用这种功能强大的方法。迁移后,您不仅会拥有大量冗余的Apache集合代码,而且在引入闭包和lambdas之前的解决方案与命令式的替代方案相比,往往是冗长的,往往不太可读。

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

答案 3 :(得分:0)

您可以尝试使用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")); 

这只是一个例子,但你可以检查而不是拥有String,Integer,你可以尝试Integer,String并拥有if statement。只是一个想法。

答案 4 :(得分:0)

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

例如:

父类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;
    }
}

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

如果Object类不是Name的实例,则表示不具有您要查找的属性,只需忽略,否则,与您想要的信息进行比较并存储以进行检索。