2012-05-02 16 views
2

私はPredicates、つまりList<Predicate<File>>のコレクションを持っています。私はその後、単一のFileを持っていて、ファイルに一致する述語(もしあれば)を取得する必要があります。私はIterables.find()を使用する行に沿って考えていたが、Predicateに渡す値ではなく、Predicateが必要であることはもちろんである。私は次の実装について考えましたが、すでにメカニズムが存在するかどうかはわかりません。一致する述語を検索します。述語の述語?

public static <T> Predicate<Predicate<? super T>> createInversePredicate(
     final T value) { 
    return new Predicate<Predicate<? super T>>() { 

     @Override 
     public boolean apply(Predicate<? super T> input) { 
      return input.apply(value); 
     } 
    }; 
} 

これは私が次の操作を実行できるようになる:

private List<Predicate<File>> filters = ...; 

@Nullable 
Predicate<File> findMatching(File file){ 
    return Iterables.find(filters, createInversePredicate(file), null); 
} 

は、より良い方法はありますか?

答えて

3

ここグアバのチームメンバーです。

これが私のやり方です。より良い方法はありません。

+0

のJava 8で「createInversePredicate」などのユーティリティメソッドをOptional<Predicate<File>>代わりに@Nullable使用できますか?そうでない場合、私はそれを問題として提案すべきですか? –

+0

これは可能ですが、非常に一般的な使用例のようには見えません。 –

3

私は「逆」の述語を作成するための複雑さを回避し、単純に不可欠のコードを使用します。

private List<Predicate<File>> filters = ...; 

@Nullable 
Predicate<File> findMatchingFilter(File file){ 
    for (Predicate<File> filter : filters) { 
     if (filter.apply(file)) { 
      return filter; 
     } 
    } 
    return null; 
} 

それは、より簡単ですし、次のプログラマは「これを理解するために1分を取る必要はありません逆」述語事業:)

+0

私は2つの理由で意見が一致しません。1)繰り返しコードが嫌いです。これには、ライブラリに存在するものをやり直すことが含まれます。 2)コードを追加することなくこれを使うことができるGuavaにはたくさんのメソッドがあります(filter、find、findOnlyなど) –

+0

私はこのような逆のことを言っているわけではありません述語は常に悪い考えです(これが私が昨日あなたの質問をアップした理由です)。このような述語を複数回および/またはさまざまな方法で再利用していることがわかった場合(filter、find、findOnlyなど)は理にかなっています。しかしそれまでは、YAGNIの原則に従い、簡単にしようと努力しました。 Guava wikiの機能的な慣用句のセクションも関連しています。http://code.google.com/p/guava-libraries/wiki/FunctionalExplained –

+1

コメントをいただき、ありがとうございました。 –

0

のJava 8のユーザーがこれを行うことができます:

Predicate<File> findMatching(File file) { 
    List<Predicate<File>> matchingFilters = filters.stream().filter(predicate -> predicate.test(file)).collect(Collectors.toList()); 
    return matchingFilters.isEmpty()? null : matchingFilters.get(0); 
} 

ここで私は、唯一の述語がファイルにマッチしますと仮定しています。

また、それはすでにそこ