我有ArrayList<Person> persons
。我想检查某人是否符合条件。喜欢:person.isFemale()
有没有更好的方法来执行此操作,而不是循环列表?有些映射或lambda方式可能吗?
编辑:
您好,感谢您的回复!
我想我问错了问题.. 我想检查列表中的任何对象是否与其他任何对象不同: boolean different =(if isMale()&amp;&amp; isFemale())列表中的某个位置。
答案 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)并检查插入方法中的条件。