我有像
这样的代码private void processFiles() {
try {
Files.walk(Paths.get(Configurations.SOURCE_PATH))
.filter(new NoDestinationPathFilter()) //<--This one
.filter(new NoMetaFilesOrDirectories()) //<--and this too
.forEach(
path -> {
new FileProcessorFactory().getFileProcessor(
path).process(path);
});
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
截至目前,我有各种其他方法,与上述方法相同,只是过滤器有所不同。有些方法有额外的过滤器,有些方法有不同或没有。
是否有可能创建一个条件所需的过滤器集合并动态传入。并且集合中的所有过滤器都应用于流。我不想对正在应用的过滤器列表进行硬编码。 我想让它基于配置。 我如何实现这一目标?
答案 0 :(得分:5)
您可以使用Files.find()
:
private void processFiles(final Path baseDir, final Consumer<? super Path> consumer,
final Collection<BiPredicate<Path, BasicFileAttributes>> filters)
throws IOException
{
final BiPredicate<Path, BasicFileAttributes> filter = filters.stream()
.reduce((t, u) -> true, BiPredicate::and);
try (
final Stream<Path> stream = Files.find(baseDir, Integer.MAX_VALUE, filter);
) {
stream.forEach(consumer);
}
}
是的,这意味着要转换过滤器......
另请参阅BiPredicate
和BasicFileAttributes
的javadoc;特别是,BiPredicate
有.and()
方法,您会发现它对您的情况很有用。
答案 1 :(得分:1)
这个怎么样?
private void processFiles(List<Predicate<Path>> filterList) {
Predicate<Path> compositeFilter=filterList.stream().reduce(w -> true, Predicate::and);
try {
Files.walk(Paths.get(Configurations.SOURCE_PATH))
.filter(compositeFilter)
.forEach(path -> {
new FileProcessorFactory().getFileProcessor(
path).process(path);
});
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}