Java 查找匹配谓词。谓词的谓词?

Java 查找匹配谓词。谓词的谓词?,java,guava,Java,Guava,我有一组谓词,比如列表。然后我有一个文件,我需要得到与该文件匹配的谓词(如果有的话)。我一直在考虑使用Iterables.find(),但这当然需要谓词而不是值来传递到谓词。我考虑过实现以下内容,但不知道是否已经存在一种机制 public static <T> Predicate<Predicate<? super T>> createInversePredicate( final T value) { return new Predi

我有一组
谓词
,比如
列表
。然后我有一个
文件
,我需要得到与该文件匹配的谓词(如果有的话)。我一直在考虑使用
Iterables.find()
,但这当然需要
谓词
而不是值来传递到
谓词
。我考虑过实现以下内容,但不知道是否已经存在一种机制

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);
        }
    };
}

publicstaticpredicateGuava团队成员


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

我会避免创建“反向”谓词的复杂性,只需使用命令式代码:

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

@Nullable
Predicate<File> findMatchingFilter(File file){
    for (Predicate<File> filter : filters) {
        if (filter.apply(file)) {
            return filter;
        }
    }
    return null;
}
私有列表过滤器=。。。;
@可空
谓词findMatchingFilter(文件){
for(谓词筛选器:筛选器){
if(filter.apply(文件)){
回流过滤器;
}
}
返回null;
}

它更简单,下一个程序员不需要花1分钟就可以理解这个“反向”谓词业务:)

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);
}
谓词查找匹配(文件){
List matchingFilters=filters.stream().filter(谓词->谓词.test(文件)).collect(Collectors.toList());
返回matchingFilters.isEmpty()?null:matchingFilters.get(0);
}
这里我假设只有一个谓词与文件匹配


您也可以在Java8中使用
可选
而不是
@Nullable

是否已经有了一个实用方法,如“createInversePredicate”?如果不是,我应该把它作为一个问题来建议吗?你可以,但它似乎不是一个非常常见的用例。我不同意,原因有两个:1)我讨厌重复代码,这包括重做库中存在的代码。这是一个虫子可以溜进的地方。2) 在Guava中有很多方法,我可以使用这些方法而不必添加代码(过滤、查找、findOnly等),我并不是说这样的反向谓词总是一个坏主意(这就是为什么我昨天对你的问题投了赞成票)。如果您发现自己多次和/或以不同的方式(过滤、查找、findOnly等)重用这样的谓词,这是有意义的。但是,在那之前,我会遵循雅格尼原则,力求简单。Guava wiki中的功能性习惯用法警告部分也与此相关:
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);
}