2

我有一个集合Predicates,比如说List<Predicate<File>>。然后我有一个File,我需要获取与文件匹配的谓词(如果有的话)。我正在考虑使用的思路,Iterables.find()但当然这需要 aPredicate不是一个值才能传递给 a 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

Guava 团队成员在这里。

我就是这样做的。没有更好的办法。

于 2012-05-02T15:44:17.617 回答
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);
}

在这里,我假设只有一个谓词与文件匹配。

您也可以在 Java 8 中使用Optional<Predicate<File>>而不是。@Nullable

于 2014-07-17T00:22:14.853 回答