动态过滤器链接Java 8

时间:2015-12-19 12:15:20

标签: java java-8

我有像

这样的代码
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();
        }
    }

截至目前,我有各种其他方法,与上述方法相同,只是过滤器有所不同。有些方法有额外的过滤器,有些方法有不同或没有。

是否有可能创建一个条件所需的过滤器集合并动态传入。并且集合中的所有过滤器都应用于流。我不想对正在应用的过滤器列表进行硬编码。 我想让它基于配置。 我如何实现这一目标?

2 个答案:

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

是的,这意味着要转换过滤器......

另请参阅BiPredicateBasicFileAttributes的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();
    }
}