[英]Using Predicate in Java for Comparison
我有一種應該將值與值列表進行比較的方法。
比較功能可以小於,大於或等於。 我遇到了這個Predicate
概念,在這種情況下,我試圖理解和實現它。 以下是我的幾個問題。
1)在Apache Commons,guava和javax.sql中定義了Predicate
類。 它們之間有什么區別? (我嘗試瀏覽文檔,但無法獲取)
2)Guava謂詞僅是為了進行過濾而沒有說布爾函數實現嗎?
3)我可以舉一個謂詞的例子嗎?
謝謝。
假設您要測試給定集合的所有元素是否都滿足某些條件,這是番石榴的Predicate
一個示例(@ColinD的注釋指向了很多現有的涉及Comparable
謂詞!):
public static class LessThan<T extends Comparable<T>> implements Predicate<T> {
private final Comparable<T> value;
public LessThan(final Comparable<T> value) {
this.value = value;
}
@Override
public boolean apply(final T input) {
return value.compareTo(input) > 0;
}
}
public static void main(final String[] args) {
final Collection<Integer> things = Arrays.asList(1, 2, 3, 4);
System.out.println(Iterables.all(things, new LessThan<Integer>(5)));
}
但是除非您可以重用該謂詞,否則應按照guava Wiki的建議考慮使用非功能版本,例如:
public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
for (Integer each : numbers) {
if (each >= value) {
return false;
}
}
return true;
}
簡而言之,謂詞之間的差異是:
apache-commons
:不是通用的; guava
:是通用的; javax.sql.rowset
:與RowSet
一起使用(用於過濾SQL請求結果)。 我相信您想要Comparable
而不是Predicate
。
我認為Errandir成為您問題的核心:謂詞是從其輸入到布爾值的函數,並且您想進行三態比較。
但是要回答您的其他問題:
Guava謂詞僅是為了進行過濾而沒有說布爾函數實現嗎?
否。Guava謂詞是一個返回布爾值的函數。 您可以用某種過濾來表達謂詞可以解決的大多數問題,但是可以在不過濾任何集合的情況下使用它們。
我可以舉一個謂詞示例嗎?
這是一個獨立於集合使用的謂詞:
Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
public boolean apply(Person person) {
return person.age() >= LEGAL_LIMIT;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.