网站流量通道,宿迁网站建设报价,网站优化自已做还是请人做,网页版传奇工作室我假设你正在谈论来自Guava的com.google.common.base.Predicate 。从API#xff1a;确定给定input的true值或false值。 例如#xff0c;一个RegexPredicate可能实现了Predicate #xff0c;并且对任何匹配给定正则expression式的string返回true。这本质上是一个booleantesti…我假设你正在谈论来自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(高阶函数)