2013-10-11 83 views
1

我有一種方法應該將值與值列表進行比較。在Java中使用謂詞進行比較

比較函數可以小於,大於或等於。我遇到了這個我試圖在這種情況下理解和實現的這個概念Predicate。 以下是我的幾個問題。

1)在apache commons,guava和javax.sql中定義了Predicate類。他們之間有什麼區別? (我嘗試通過文檔,但無法得到它)

2)是番石榴謂詞只意味着做過濾,而不是說布爾函數implementationaion?

3)我可以得到一個Predicate的例子嗎?

謝謝。

+4

我要給你的假設,你,你打完它 – Cruncher

+0

番石榴有一個'Predicate'接口之前提交這個疑點利益,但它是爲過濾。 –

+0

@SotiriosDelimanolis您可以使用(C++風格)謂詞實現一個比較器,其中假定謂詞在if

回答

6

假設你想測試一個給定的集合中的所有元素是否滿足一些條件,這是番石榴的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))); 
} 

但除非你可以重複使用謂詞,你應該利弊像番石榴維基建議的那樣,可以是非功能性版本。:

public static boolean allLessThan(Collection<Integer> numbers, Integer value) { 
    for (Integer each : numbers) { 
     if (each >= value) { 
     return false; 
     } 
    } 
    return true; 
} 
+0

謝謝......我可以使用Iterables.any方法並將它傳遞給一個集合以及一個可以完成我的工作的謂詞。這是合乎邏輯的嗎? – LPD

+0

取決於你想達到什麼?回到我的示例'LessThan'謂詞 - 如果通過any()過濾集合,它將返回true,如果集合中至少有一個元素滿足謂詞,即小於設置值。請參閱[guava文檔](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)瞭解更多選項。 – Pyranja

+1

僅供參考,您的'LessThan'謂詞相當於[Range.lessThan(C)](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html#每種不超過(C))。 – ColinD

3

總之,謂詞之間的差異是:

  • apache-commons:是不通用的;
  • guava:是通用的;使用RowSet s(用於過濾SQL請求結果)。

我相信你想ComparablePredicate

3

我認爲Errandir得到了你的問題的核心:謂詞是從它的輸入到布爾值的函數,並且你想做三態比較。

雖則回答您的其他問題:

是番石榴謂詞只是爲了做過濾,而不是說一個布爾函數實現?

不是。Guava謂詞是一個返回布爾值的函數。 您可以通過某種過濾術語解釋謂詞所解決的大多數問題,但可以在沒有任何正在過濾的集合的情況下使用它們。

我可以得到一個Predicate的例子嗎?

下面是有一個謂語採用獨立的集合:

Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() { 
    public boolean apply(Person person) { 
    return person.age() >= LEGAL_LIMIT; 
    } 
}; 
+0

我可以使用'Iterables.any'方法並通過它一個集合以及一個做我的工作的謂詞。這是合乎邏輯的嗎? – LPD

+0

@LPD,是的。這是檢查集合是否包含滿足約束條件的一種方法。 –