我假设你说的是从Guava的
com.google.common.base.Predicate。
从API:
Determines a true or false value for a given input. For example, a RegexPredicate might implement Predicate, and return true for any string that matches its given regular expression.
这本质上是一个布尔测试的OOP抽象。
例如,你可能有一个这样的帮助方法:
static boolean isEven(int num) {
return (num % 2) == 0; // simple
}
现在,给定一个List< Integer> ;,你只能处理这样的偶数:
List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
for (int number : numbers) {
if (isEven(number)) {
process(number);
}
}
使用谓词,if测试抽象为类型。这允许它与API的其余部分(例如Iterables)进行互操作,这些API有许多使用谓词的实用程序方法。
因此,你现在可以这样写:
Predicate isEven = new Predicate() {
@Override public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Iterable evenNumbers = Iterables.filter(numbers, isEven);
for (int number : evenNumbers) {
process(number);
}
注意,现在for-each循环在没有if测试的情况下要简单得多。我们已经通过定义Iterable< Integer> evenNumbers,通过使用谓词过滤。
API链接
>返回满足谓词的元素。
在高阶函数
谓词允许Iterables.filter充当所谓的高阶函数。就其自身而言,这提供了许多优点。取列表< Integer>数字示例。假设我们要测试所有数字是否为正数。我们可以这样写:
static boolean isAllPositive(Iterable numbers) {
for (Integer number : numbers) {
if (number < 0) {
return false;
}
}
return true;
}
//...
if (isAllPositive(numbers)) {
System.out.println("Yep!");
}
使用谓词,并与其他库进行互操作,我们可以写成:
Predicate isPositive = new Predicate() {
@Override public boolean apply(Integer number) {
return number > 0;
}
};
//...
if (Iterables.all(numbers, isPositive)) {
System.out.println("Yep!");
}
希望你现在可以看到更高的抽象中的值,例如“按给定谓词过滤所有元素”,“检查所有元素是否满足给定谓词”等等为更好的代码。
不幸的是,Java没有第一类方法:你不能将方法传递给Iterables.filter和Iterables.all。当然,你可以传递Java中的对象。因此,定义了谓词类型,并且您传递实现此接口的对象。
也可以看看