我想基于具有特定属性的列表中的对象。
例如,假设我有这个类的对象列表:
class Person {
private String name;
private String id;
}
我知道我可以使用以下命令获取列表中人员名称的所有:
Collection<String> names = CollectionUtils.collect(
personList,
TransformerUtils.invokerTransformer("getName"));
但我要做的是获取名称为Person
的{{1}}个对象的列表。我没有Java 8。
答案 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;根据您的Transformer
和transformedPredicate
:
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的实例,则表示不具有您要查找的属性,只需忽略,否则,与您想要的信息进行比较并存储以进行检索。