2

のコレクションがPredicatesありますList<Predicate<File>>。次に、単一Fileのファイルがあり、ファイルに一致する述語 (存在する場合) を取得する必要があります。私は using の方針に沿って考えていましIterables.find()たが、もちろんそれは aPredicateに渡す値ではありません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);
}

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

4

3 に答える 3

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 分もかからないでしょう :)

于 2012-05-02T22:56:20.387 に答える
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);
}

ここでは、ファイルに一致する述語は 1 つだけであると想定しています。

Java 8Optional<Predicate<File>>の代わりに使用することもできます。@Nullable

于 2014-07-17T00:22:14.853 に答える