A Predicate是一個布爾值函數,給定一個輸入測試屬性是真還是假。謂詞也稱爲屬性的同義詞。
我首先定義一個Predicate
接口。
public abstract class Predicate<T> {
public abstract boolean eval(T t);
public Predicate<T> and(Predicate<? super T> p) {...};
public Predicate<T> and(Predicate<? super T> ... p) {...};
public Predicate<T> negate() {...};
public Predicate<T> or(Predicate<? super T> p) {...};
public Predicate<T> or(Predicate<? super T> ... p) {...};
public Predicate<T> xor(Predicate<? super T> p) {...};
public Predicate<T> xor(Predicate<? super T> ... p) {...};
}
然後,你可以定義每個屬性:
public static final Predicate<Integer> EVEN = new Predicate<Integer>(){
public boolean eval(Integer n) {
return n % 2 == 0;
}
};
假設要篩選一組基於其特性的整數,那麼我會假設你必須定義一個過濾方法(其對應於古典high-order function過濾在給定的謂詞項):
public static <T> List<T> filter(List<? extends T> items,
Predicate<? super T> predicate) {
List<T> result = new ArrayList<T>();
for(T item : items){
if(predicate.eval(item)){
result.add(item);
}
}
return result;
}
讓我們看看這種過濾在操作的一個例子:
List<Integer> myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);
List<Integer> onlyEven = filter(myNumbers, EVEN);
List<Integer> positiveAndEven = filter(myNumbers, POSITIVE.and(EVEN));
好這個做法是,一旦JDK 8釋放所有這些功能將由語言通過使用lambda expressions提供。
最終,你將取代你的屬性定義lambda表達式:
public static final Predicate<Integer> EVEN = n -> n % 2 == 0;
public static final Predicate<Integer> ODD = n -> n % 2 != 0;
public static final Predicate<Integer> POSITIVE = n -> n > 0;
public static final Predicate<Integer> NEGATIVE = n -> n < 0;
你過濾將提供內置在你的收藏,讓你簡單地做:
List<Integer> myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);
List<Integer> onlyEven = myNumbers.filter(EVEN).into(new ArrayList<Integer>());
List<Integer> positiveEven = myNumbers.filter(POSITIVE.and(EVEN)).into(new ArrayList<Integer>());
List<Integer> positiveOrOdd = myNumbers.filter(POSITIVE.or(ODD)).into(new ArrayList<Integer>());
的謂詞接口將成爲JDK 8 java.util.functions
包的一部分。所以,最終你將能夠拋棄你的並使用JDK中內置的一個。
什麼'新屬性可以隨時添加.'是什麼意思?它們可以在程序運行時添加嗎?謂詞是如何定義的? 「 – 2012-03-28 01:53:48
」可以隨時添加新的屬性「只意味着我不應該期望這個列表保持靜態。它們將被正常添加到該程序中。謂詞由業務邏輯定義,並且謂詞和屬性之間沒有真正的「漂亮」連接。 – Jeremy 2012-03-28 01:55:33
但是,謂詞表達是如何表達的?它們與「iff num%2 == 0」是否完全相同,即在某種語言中,您需要解析和評估謂詞? – 2012-03-28 01:58:55