检查ArrayList中的某个对象是否满足某些条件

时间:2011-07-17 10:56:58

标签: java lambda mapping arraylist conditional-statements

我有ArrayList<Person> persons。我想检查某人是否符合条件。喜欢:person.isFemale()

有没有更好的方法来执行此操作,而不是循环列表?有些映射或lambda方式可能吗?

编辑:

您好,感谢您的回复!

我想我问错了问题.. 我想检查列表中的任何对象是否与其他任何对象不同: boolean different =(if isMale()&amp;&amp; isFemale())列表中的某个位置。

4 个答案:

答案 0 :(得分:4)

我建议使用Guava(正式的Google Collections),特别是Iterables.any来测试单个实例是否与条件匹配,或者Iterables.all来测试所有实例是否与条件匹配。您可以将谓词设置为匹配某个逻辑表达式,或者测试所有元素是否等于列表的头部。

这并没有做任何花哨的事情,但它至少让你养成了以功能风格编写代码的习惯。

答案 1 :(得分:3)

您可以使用Guava

List<Person> persons = ...;     

List<Person> matchingUsers = Collections2.filter(persons, new Predicate<Person>() {

    @Override
    public boolean apply(Person person) {
        return person.isFemale();
    }
});

if (!matchingUsers.isEmpty()) {
    ...
}

答案 2 :(得分:1)

为什么要“循环列表”以找出有关Person实例的内容 - 如果你有对Person的引用,只需使用它。我只能假设你的意思是说:

  

如何找到符合特定条件的Person实例?

如果是这样,你可以使用比较器对列表进行排序,使用isFemale()对Persons进行排序,这样它们就会转到List的头部,然后你可以循环直到person.isFemale()为false,如下所示: / p>

List<Person> persons = ...; 
Collections.sort(list, new Comparator<Person>() {
    public int compare(Person o1, Person o2) {
        return o1.isFemale().compareTo(o2.isFemale()); // Note: Assumes isFemale returns Boolean, not boolean. Otherwise, wrap before comparing.
    }
});

for (Person person : persons) {
    if (!person.isFemale()) {
        break;
    }
    // Do something with females
}

注意:这不是的想法,因为它会比通常的方式遍历列表慢,但是我试图回答所说的问题。

答案 3 :(得分:1)

我不熟悉Guava,但无论如何你都会用Iterables.any“循环列表”。 如果Person的条件在列表中永远不会改变,那么使用ArrayList的自定义子类(或其他列表impl)并检查插入方法中的条件。