从API:
确定一个
true
或
false
给定输入的值。例如,A
RegexPredicate
可能实施
Predicate
,并为与其给定正则表达式匹配的任何字符串返回true。
这本质上是对
boolean
测试。
例如,您可能有这样一个助手方法:
static boolean isEven(int num) {
return (num % 2) == 0; // simple
}
现在,给出了
List
,您只能处理这样的偶数:
List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
for (int number : numbers) {
if (isEven(number)) {
process(number);
}
}
用
Predicate
, the
if
测试被抽象为一个类型。这允许它与API的其余部分进行互操作,例如
Iterables
有许多实用方法
谓语
.
因此,您现在可以这样写:
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循环在没有
如果
测试。通过定义
Iterable evenNumbers
通过
filter
使用一个
谓语
.
API链接
关于高阶函数
谓语
允许
ITerables.filter(过滤器)
作为所谓的高阶函数。这本身就提供了许多优势。拿
List numbers
上面的例子。假设我们想测试所有的数字是否都是正数。我们可以这样写:
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中。因此,
谓语
类型已定义,您将通过
物体
而是实现这个接口。
也见