获取第一个满足条件的对象

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 的谓词匹配=]