[英]Using Predicate in Java for Comparison
我有一种应该将值与值列表进行比较的方法。
比较功能可以小于,大于或等于。 我遇到了这个Predicate
概念,在这种情况下,我试图理解和实现它。 以下是我的几个问题。
1)在Apache Commons,guava和javax.sql中定义了Predicate
类。 它们之间有什么区别? (我尝试浏览文档,但无法获取)
2)Guava谓词仅是为了进行过滤而没有说布尔函数实现吗?
3)我可以举一个谓词的例子吗?
谢谢。
假设您要测试给定集合的所有元素是否都满足某些条件,这是番石榴的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
一起使用(用于过滤SQL请求结果)。 我相信您想要Comparable
而不是Predicate
。
我认为Errandir成为您问题的核心:谓词是从其输入到布尔值的函数,并且您想进行三态比较。
但是要回答您的其他问题:
Guava谓词仅是为了进行过滤而没有说布尔函数实现吗?
否。Guava谓词是一个返回布尔值的函数。 您可以用某种过滤来表达谓词可以解决的大多数问题,但是可以在不过滤任何集合的情况下使用它们。
我可以举一个谓词示例吗?
这是一个独立于集合使用的谓词:
Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
public boolean apply(Person person) {
return person.age() >= LEGAL_LIMIT;
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.