我在列表中下载符合条件的第一个对象时遇到问题.
我的代码总是返回列表中的第一个对象,无论条件如何.返回id = 1的人.
main(){
public static void main(String args[]) {
List<Person> persons = Lists.newArrayList();
persons.add(new Person("1", "aaa",23, true));
persons.add(new Person("2", "bbb",16, false));
persons.add(new Person("3", "ccc",56, true));
Person per = (Person) Iterables.getFirst(persons, new Predicate<Person>() {
@Override
public boolean apply(Person person) {
return person.getAge()> 50;
}
});
System.out.println(per.getId()); // always "1"
}
public class Person {
private String id;
private String name;
private int age;
private boolean isSome;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSome() {
return isSome;
}
public void setSome(boolean isPaid) {
this.isSome = isPaid;
}
public Person(){}
public Person(String id, String name, int age, boolean isSome){
this.id = id;
this.name = name;
this.age = age;
this.isSome = isSome;
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会发生这种情况以及如何处理它?
Iterables.getFirst()不会做你认为它做的事情.您应该使用Iterables.tryFind()method,它返回传递的iterable中的第一个匹配元素.它返回一个Optional<T>,所以你需要调用get()结果,或者Optional#or(),如果你想要一些默认值.
Person per = Iterables.tryFind(persons, new Predicate<Person>() {
@Override
public boolean apply(Person person) {
return person.getAge()> 50;
}
}).or(defaultPerson);
Run Code Online (Sandbox Code Playgroud)