Predicate是一个布尔值函数,它给出一个输入来测试属性是真还是假。谓词也称为属性,它们是属性的同义词。
我首先定义一个Predicate接口。
public abstract class Predicate {
public abstract boolean eval(T t);
public Predicate and(Predicate super T> p) {...};
public Predicate and(Predicate super T> ... p) {...};
public Predicate negate() {...};
public Predicate or(Predicate super T> p) {...};
public Predicate or(Predicate super T> ... p) {...};
public Predicate xor(Predicate super T> p) {...};
public Predicate xor(Predicate super T> ... p) {...};
}然后,您可以定义每个属性:
public static final Predicate EVEN = new Predicate(){
public boolean eval(Integer n) {
return n % 2 == 0;
}
};假设你想根据它们的属性过滤一组整数,那么我假设你必须定义一个过滤方法(它对应于一个经典的high-order function来过滤给定谓词上的项目):
public static List filter(List extends T> items,
Predicate super T> predicate) {
List result = new ArrayList();
for(T item : items){
if(predicate.eval(item)){
result.add(item);
}
}
return result;
}让我们看一下这个过滤的实例:
List myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);
List onlyEven = filter(myNumbers, EVEN);
List positiveAndEven = filter(myNumbers, POSITIVE.and(EVEN));这种方法的优点是,一旦JDK 8被释放,语言将通过使用lambda expressions提供所有这些功能。
最终,您将替换lambda表达式的属性定义:
public static final Predicate EVEN = n -> n % 2 == 0;
public static final Predicate ODD = n -> n % 2 != 0;
public static final Predicate POSITIVE = n -> n > 0;
public static final Predicate NEGATIVE = n -> n < 0;并且您的过滤将在您的收藏中内置提供,因此您只需执行以下操作:
List myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);
List onlyEven = myNumbers.filter(EVEN).into(new ArrayList());
List positiveEven = myNumbers.filter(POSITIVE.and(EVEN)).into(new ArrayList());
List positiveOrOdd = myNumbers.filter(POSITIVE.or(ODD)).into(new ArrayList());谓词接口将是JDK 8 java.util.functions包的一部分。所以,最终你将能够抛弃你的并使用JDK中内置的那个。