获取第一个满足条件的对象
Getting the first object that satisfies condition
我无法下载列表中满足条件的第一个对象。
我的代码总是 returns 列表中的第一个对象,无论条件如何。 Returns 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;
}
}
有人可以解释为什么会发生这种情况以及如何处理吗?
Iterables.getFirst()
doesn't do what you think it does. You should be using Iterables.tryFind()
方法,其中 returns 传递了 iterable 中的第一个匹配元素。它 returns 一个 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);
Iterables.getFirst
returns 第一个参数的第一个元素,例如第一要素人。第二个参数是 persons
为空时的默认值。您可以使用 filter
代替:
Person person = Iterables.getFirst(Iterables.filter(persons, new Predicate<Person>() {
@Override
public boolean apply(Person person) {
return person.getAge() > 50;
}
}), null);
尽管您正尝试使用番石榴解决此问题,但您可能对如何在 java8 中完成此操作感兴趣:
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 = persons.stream().filter(p -> p.getAge() > 50).findFirst().get();
System.out.println(per.getId());
findFirst will return an Optional<Person>
为了简洁起见,我称之为 get on it,但请注意 get will return null 不应该与 [=12 的谓词匹配=]
我无法下载列表中满足条件的第一个对象。
我的代码总是 returns 列表中的第一个对象,无论条件如何。 Returns 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;
}
}
有人可以解释为什么会发生这种情况以及如何处理吗?
Iterables.getFirst()
doesn't do what you think it does. You should be using Iterables.tryFind()
方法,其中 returns 传递了 iterable 中的第一个匹配元素。它 returns 一个 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);
Iterables.getFirst
returns 第一个参数的第一个元素,例如第一要素人。第二个参数是 persons
为空时的默认值。您可以使用 filter
代替:
Person person = Iterables.getFirst(Iterables.filter(persons, new Predicate<Person>() {
@Override
public boolean apply(Person person) {
return person.getAge() > 50;
}
}), null);
尽管您正尝试使用番石榴解决此问题,但您可能对如何在 java8 中完成此操作感兴趣:
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 = persons.stream().filter(p -> p.getAge() > 50).findFirst().get();
System.out.println(per.getId());
findFirst will return an Optional<Person>
为了简洁起见,我称之为 get on it,但请注意 get will return null 不应该与 [=12 的谓词匹配=]