102

PredicateJavaで使用するコードを調べています。私は使ったことがありませんPredicate。誰かが私PredicateにJavaでの実装のチュートリアルや概念的な説明を教えてもらえますか?

4

4 に答える 4

203

com.google.common.base.Predicate<T>私はあなたがGuavaから話していると仮定しています.

API から:

true指定された入力のorfalse値を決定します。たとえば、 aRegexPredicateは を実装Predicate<String>し、指定された正規表現に一致する任意の文字列に対して true を返します。

booleanこれは本質的に、テストの OOP 抽象化です。

たとえば、次のようなヘルパー メソッドがあるとします。

static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}

が与えられたList<Integer>場合、次のように偶数のみを処理できます。

    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    for (int number : numbers) {
        if (isEven(number)) {
            process(number);
        }
    }

ではPredicateifテストは型として抽象化されます。これにより、 を使用するIterables多くのユーティリティ メソッドを持つ などの残りの API と相互運用できますPredicate

したがって、次のように書くことができます。

    Predicate<Integer> isEven = new Predicate<Integer>() {
        @Override public boolean apply(Integer number) {
            return (number % 2) == 0;
        }               
    };
    Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);

    for (int number : evenNumbers) {
        process(number);
    }

iffor-each ループは、テストなしではるかに単純になっていることに注意してください。を定義Iterable<Integer> evenNumbersし、filterを使用することにより、より高いレベルの抽象化に達しましたPredicate

API リンク


高階関数について

PredicateIterables.filterいわゆる高階関数として機能することができます。これだけでも、多くの利点があります。上記のList<Integer> numbers例を見てください。すべての数値が正かどうかをテストしたいとします。次のように書くことができます。

static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}

//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}

を使用Predicateして、残りのライブラリと相互運用すると、代わりに次のように記述できます。

Predicate<Integer> isPositive = new Predicate<Integer>() {
    @Override public boolean apply(Integer number) {
        return number > 0;
    }       
};

//...
if (Iterables.all(numbers, isPositive)) {
    System.out.println("Yep!");
}

「指定された述語ですべての要素をフィルタリングする」、「すべての要素が指定された述語を満たすかどうかをチェックする」などのルーチンのより高い抽象化で値を確認できるようになったことを願っています。

残念ながら、Java にはファーストクラスのメソッドがありません。メソッドIterables.filterandに渡すことはできませんIterables.all。もちろん、 Javaでオブジェクトを渡すこともできます。したがって、Predicate型が定義され、代わりにこのインターフェイスを実装するオブジェクトを渡します。

こちらもご覧ください

于 2010-06-02T04:53:42.247 に答える
14

述語は、真/偽 (つまりブール) 値である命題とは対照的に、真/偽 (つまりブール) 値を返す関数です。Java では、スタンドアロン関数を持つことはできないため、述語を表すオブジェクトのインターフェイスを作成して述語を作成し、そのインターフェイスを実装するクラスを提供します。述語のインターフェースの例は次のとおりです。

public interface Predicate<ARGTYPE>
{
    public boolean evaluate(ARGTYPE arg);
}

そして、次のような実装があるかもしれません:

public class Tautology<E> implements Predicate<E>
{
     public boolean evaluate(E arg){
         return true;
     }
}

概念をよりよく理解するために、一次論理について読みたいと思うかもしれません。

編集
Java 8 の時点で Java API で定義されて いる標準のPredicateインターフェース ( java.util.function.Predicate ) があります。Java 8 より前では、com.google.common.base.Predicateインターフェースをグアバ

また、Java 8 の時点では、ラムダを使用して述語を記述する方がはるかに簡単であることに注意してください。たとえば、Java 8 以降ではp -> true、上記のような名前付きトートロジー サブクラスを定義する代わりに、関数に渡すことができます。

于 2010-06-02T04:54:59.450 に答える
0

マイケルが言ったことに追加します:

Java でのコレクションのフィルタリングでは、Predicate を次のように使用できます。

public static <T> Collection<T> filter(final Collection<T> target,
   final Predicate<T> predicate) {
  final Collection<T> result = new ArrayList<T>();
  for (final T element : target) {
   if (predicate.apply(element)) {
    result.add(element);
   }
  }
  return result;
}

1 つの可能な述語は次のとおりです。

final Predicate<DisplayFieldDto> filterCriteria = 
                    new Predicate<DisplayFieldDto>() {
   public boolean apply(final DisplayFieldDto displayFieldDto) {
    return displayFieldDto.isDisplay();
   }
  };

使用法:

 final List<DisplayFieldDto> filteredList=
 (List<DisplayFieldDto>)filter(displayFieldsList, filterCriteria);
于 2010-06-02T10:23:42.813 に答える
0

ここで、 Java ドキュメントの例または Predicate の使用例を表示できます。

基本的には、特定の基準に基づいて結果セットの行をフィルタリングし、基準を満たす行に対して true を返すために使用されます。

 // the age column to be between 7 and 10
    AgeFilter filter = new AgeFilter(7, 10, 3);

    // set the filter.
    resultset.beforeFirst();
    resultset.setFilter(filter);
于 2010-06-02T04:44:38.553 に答える