我有一个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);
}
有更好的方法吗?
答案 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
。