我有一个方法应该将一个值与一个值列表进行比较。
比较函数可以小于、大于或等于。我遇到了这个Predicate
概念,我试图在这种情况下理解和实施。下面是我的几个问题。
1)Predicate
在apache commons、guava和javax.sql中定义了类。他们之间有什么区别?(我尝试通过文档但无法得到它)
2)番石榴谓词是否仅用于过滤而不是布尔函数实现?
3)我可以得到一个谓词的例子吗?
谢谢。
假设您要测试给定集合的所有元素是否满足某些条件,这是一个使用 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)));
}
但是除非您可以重用该谓词,否则您应该考虑使用 guava wiki 建议的非功能版本,例如:
public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
for (Integer each : numbers) {
if (each >= value) {
return false;
}
}
return true;
}
简而言之,谓词之间的区别是:
apache-commons
: 不是通用的;guava
: 是通用的;javax.sql.rowset
: 与RowSet
s 一起使用(用于过滤 SQL 请求结果)。我相信你Comparable
不想Predicate
。
我认为 Errandir 解决了您问题的核心:谓词是从输入到布尔值的函数,并且您想要进行三态比较。
不过,要回答您的其他问题:
Guava 谓词是否仅用于过滤而不是布尔函数实现?
不。番石榴谓词是一个返回布尔值的函数。您可以根据某种过滤来表达由谓词解决的大多数问题,但它们可以在没有任何被过滤的集合的情况下使用。
我可以获得谓词的示例吗?
这是一个使用独立于集合的谓词:
Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
public boolean apply(Person person) {
return person.age() >= LEGAL_LIMIT;
}
};