3

値を値のリストと比較するメソッドがあります。

比較関数は、より小さい、より大きい、または等しいことができます。Predicateこの場合、理解して実装しようとしているこの概念に出くわしました。以下は私のいくつかの質問です。

1) PredicateApache commons、guava、javax.sql で定義されているクラスがあります。それらの違いは何ですか?(ドキュメントを調べてみましたが、取得できませんでした)

2) Guava 述語は、フィルタリングを行うことのみを意図しており、ブール関数の実装を意味していませんか?

3) 述語の例を入手できますか?

ありがとう。

4

3 に答える 3

7

特定のコレクションのすべての要素が何らかの条件を満たしているかどうかをテストしたいと仮定すると、これはグアバの例です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;
}
于 2013-10-11T18:23:47.103 に答える
3

つまり、述語の違いは次のとおりです。

  • apache-commons: 一般的ではありません。
  • guava: 一般的です。
  • javax.sql.rowset: RowSets とともに使用します (SQL 要求の結果をフィルタリングするため)。

私はあなたが望んでComparableいないと信じていますPredicate

于 2013-10-11T18:00:43.177 に答える
3

Errandir は問題の核心に到達したと思います。述語は、入力からブール値への関数であり、トライステート比較を行いたいと考えています。

ただし、他の質問に答えるには:

Guava 述語は、フィルタリングを行うことだけを意図しており、ブール関数の実装を意味していませんか?

いいえ。グアバの述語はブール値を返す関数です。述語によって解決されるほとんどの問題は、ある種のフィルター処理の観点から表現できますが、それらはフィルター処理されているコレクションなしで使用できます。

述語の例を取得できますか?

コレクションから独立した uses を持つ述語を次に示します。

Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
  public boolean apply(Person person) {
    return person.age() >= LEGAL_LIMIT;
  }
};
于 2013-10-11T18:14:23.620 に答える