Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用谓词进行比较_Java_Guava - Fatal编程技术网

在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
    :用于
    rowset
    s(用于筛选sql请求结果)


我相信您不希望使用
谓词

我想这已经触及了问题的核心:谓词是从其输入到布尔值的函数,您希望进行三态比较

要回答您的其他问题,请执行以下操作:

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 iff
a
。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;
}