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

use*_*659 5 java guava

我在列表中下载符合条件的第一个对象时遇到问题.

我的代码总是返回列表中的第一个对象,无论条件如何.返回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)

有人可以解释为什么会发生这种情况以及如何处理它?

Roh*_*ain 9

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)