找到匹配的谓词。谓语谓语?

时间:2012-05-02 15:40:09

标签: java guava

我有一个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 :(得分:3)

番石榴团队成员。

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

答案 1 :(得分:3)

我会避免创建&#34;反向&#34;的复杂性。谓词,并简单地使用命令式代码:

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分钟来理解这个&#34;反向&#34;谓词业务:)

答案 2 :(得分: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