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显示它不起作用吗?当然可以。我过一会儿再发布。我确实知道它不起作用的原因。你的代码绝对正确。非常感谢。投票通过。