我假设你正在谈论来自Guava的com.google.common.base.Predicate 。
从API:
确定给定input的true值或false值。 例如,一个RegexPredicate可能实现了Predicate ,并且对任何匹配给定正则expression式的string返回true。
这本质上是一个booleantesting的OOP抽象。
例如,你可能有一个这样的帮手方法:
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 , iftesting被抽象为一个types。 这使得它可以与API的其他部分互操作,比如Iterables ,它有很多使用Predicate实用方法。
因此,你现在可以写这样的东西:
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); }
请注意, if没有iftesting,现在for-each循环要简单得多。 通过使用Predicate进行filter ,我们定义了Iterable evenNumbers ,从而达到了更高的抽象级别。
API链接
Iterables.filter
返回满足谓词的元素。
在高阶函数上
Predicate允许Iterables.filter作为所谓的高阶函数。 就其本身而言,这提供了许多优点。 以上面的List numbers例子。 假设我们要testing所有数字是否都是正数。 我们可以写这样的东西:
static boolean isAllPositive(Iterable numbers) { for (Integer number : numbers) { if (number < 0) { return false; } } return true; } //... if (isAllPositive(numbers)) { System.out.println("Yep!"); }
通过一个Predicate ,并与其他库进行互操作,我们可以写下这个:
Predicate isPositive = new Predicate() { @Override public boolean apply(Integer number) { return number > 0; } }; //... if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!"); }
希望你现在可以看到更高抽象的例子,比如“用给定谓词过滤所有元素”,“检查所有元素是否满足给定的谓词”等等,以获得更好的代码。
不幸的是,Java没有一stream的方法:你不能将方法传递给Iterables.filter和Iterables.all 。 当然,您可以在Java中传递对象 。 因此,定义了Predicatetypes,而是传递实现此接口的对象 。
也可以看看
维基百科/高阶函数
维基百科/filter(高阶函数)