簡體   English   中英

在Java中使用謂詞進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM