我有一个方法可以将值与值列表进行比较。
比较功能可以小于,大于或等于。我遇到了这个Predicate
概念,我想在这种情况下理解并实施。
以下是我的几个问题。
1)在apache commons,guava和javax.sql中定义了Predicate
类。他们之间有什么区别? (我试过浏览文档,但无法得到它)
2)Guava谓词只是意味着做过滤而不是说布尔函数实现吗?
3)我能为谓词得到一个例子吗?
感谢。
答案 0 :(得分:6)
假设您要测试给定集合的所有元素是否满足某些条件,这是guava的Predicate
的示例(@ColinD的注释指向涉及Comparable
的大量已存在的谓词! ):
public static class LessThan<T extends Comparable<T>> implements Predicate<T> {
private final Comparable<T> value;
public LessThan(final Comparable<T> value) {
this.value = value;
}
@Override
public boolean apply(final T input) {
return value.compareTo(input) > 0;
}
}
public static void main(final String[] args) {
final Collection<Integer> things = Arrays.asList(1, 2, 3, 4);
System.out.println(Iterables.all(things, new LessThan<Integer>(5)));
}
但除非您可以重用该谓词,否则您应该考虑番石榴维基建议的非功能版本,例如: :
public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
for (Integer each : numbers) {
if (each >= value) {
return false;
}
}
return true;
}
答案 1 :(得分:3)
简而言之,Predicates之间的差异是:
apache-commons
:不是通用的; guava
:是通用的; javax.sql.rowset
:用于RowSet
s(用于过滤SQL请求结果)。我认为您希望Comparable
不是Predicate
。
答案 2 :(得分:3)
我认为Errandir得到了问题的核心:谓词是从输入到布尔值的函数,你想做三态比较。
回答你的其他问题:
Guava谓词是否仅仅意味着进行过滤而不是说布尔函数实现?
没有。 Guava谓词是一个返回布尔值的函数。 您可以使用谓词在某种过滤方面解决大多数问题,但可以在没有任何过滤的集合的情况下使用它们。
我可以获得Predicate的示例吗?
这是一个独立于集合使用的谓词:
Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
public boolean apply(Person person) {
return person.age() >= LEGAL_LIMIT;
}
};