在Java中使用谓词进行比较
我有一个方法,用来比较一个值和一系列值 比较函数可以小于、大于或等于。我遇到了这个在Java中使用谓词进行比较,java,guava,Java,Guava,我有一个方法,用来比较一个值和一系列值 比较函数可以小于、大于或等于。我遇到了这个谓词概念,我试图在本例中理解并实现它。 下面是我的几个问题 1) apache commons、guava和javax.sql中定义了谓词类。他们之间有什么区别?(我试着查看文档,但没能找到) 2) Guava谓词是否仅用于过滤而不是布尔函数实现 3) 我能举一个谓词的例子吗 谢谢。简而言之,谓词之间的区别是: apachecommons:不是通用的 番石榴:是通用的 javax.sql.rowset:用于row
谓词
概念,我试图在本例中理解并实现它。
下面是我的几个问题
1) apache commons、guava和javax.sql中定义了谓词
类。他们之间有什么区别?(我试着查看文档,但没能找到)
2) Guava谓词是否仅用于过滤而不是布尔函数实现
3) 我能举一个谓词的例子吗
谢谢。简而言之,谓词之间的区别是:
:不是通用的李>apachecommons
:是通用的李>番石榴
:用于javax.sql.rowset
s(用于筛选sql请求结果)rowset
我相信您不希望使用
谓词
我想这已经触及了问题的核心:谓词是从其输入到布尔值的函数,您希望进行三态比较
要回答您的其他问题,请执行以下操作:
Guava谓词是否仅用于过滤而不是布尔函数实现
不是。番石榴谓词是一个返回布尔值的函数。
您可以将谓词解决的大多数问题表述为某种过滤,但它们可以在不过滤任何集合的情况下使用
我能举一个谓词的例子吗
下面是一个独立于集合使用的谓词:
Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
public boolean apply(Person person) {
return person.age() >= LEGAL_LIMIT;
}
};
谓词IsAuthorizedToBuyAlol=新谓词(){
公共布尔值应用(个人){
返回人.年龄()>=法定人数限制;
}
};
假设您想测试给定集合的所有元素是否满足某些条件,这是一个使用guava的谓词的示例(@ColinD的注释指向大量已经存在的谓词,涉及Comparable
!):
公共静态类LessThan实现谓词{
私人最终可比价值;
公共债务(最终可比价值){
这个值=值;
}
@凌驾
公共布尔应用(最终T输入){
返回值。比较(输入)>0;
}
}
公共静态void main(最终字符串[]args){
最终收集的东西=Arrays.asList(1,2,3,4);
System.out.println(Iterables.all(things,new-LessThan(5));
}
<>但是除非你能重用那个谓词,否则你应该考虑一个非功能版本,如番石榴维基所建议的,例如:
public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
for (Integer each : numbers) {
if (each >= value) {
return false;
}
}
return true;
}
public静态布尔allLessThan(集合号,整数值){
对于(每个整数:数字){
如果(每个>=值){
返回false;
}
}
返回true;
}
我想让你有点疑惑,假设你在完成输入之前提交了它,因为Guava有一个谓词
接口,但它是用于过滤的。@SotiriosDelimanolis你可以使用(C++风格)谓词实现一个比较器,其中假设谓词返回true iffa
。e、 例如,返回较少的值。应用(a,b)-1:更少。申请(b,a)?1 : 0;
@ChrisJester Young在这种情况下,一个谓词是否应该返回所有较小的值,另一个等于,而另一个大于?@SotiriosDelimanolis对此进行了反思,显然你不能直接使用谓词,因为它是一元的,但假设有一个二进制版本,总是假定返回a
是否小于b
。您只需交换参数来测试另一个方向。至少,这就是C++中的习惯用法。我可以使用<代码>迭代。任何< /Cult>方法,并传递一个集合以及一个谓词来完成我的工作。这合乎逻辑吗?@LPD,是的。这是检查集合是否包含满足约束的内容的一种方法。谢谢……我可以使用Iterables.any方法,并向它传递一个集合以及一个执行我的工作的谓词。这合乎逻辑吗?取决于你想要实现什么?返回到我的示例LessThan
谓词-如果通过any()
筛选集合,则如果集合中至少有一个元素满足谓词,即小于设置值,则返回true。有关更多选项,请参见。仅供参考,您的LessThan
谓词相当于。我知道guava应该提供这样一个简单的谓词,感谢您指出正确的位置!
public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
for (Integer each : numbers) {
if (each >= value) {
return false;
}
}
return true;
}