以被动方式从流中删除数据库中已经存在的对象

时间:2019-01-28 05:15:25

标签: java java-stream reactive-programming flux spring-webflux

我正在扫描目录中的文件,然后处理结果。我想从数据存储中已有的扫描结果中删除文件,然后再进行进一步处理。

尝试使用反应式mongodb以反应方式进行此操作。我只是不确定如何以使用数据库查询结果的方式实现过滤器。

@Override
public Flux<File> findFiles(Directory directory) {

    // Only get these file types as we can't process anything else
    final Predicate<Path> extensions = path ->
            path.toString().endsWith(".txt") ||
                    path.toString().endsWith(".doc") ||
                    path.toString().endsWith(".pdf");

    final Set<File> files = fileService.findAll(Paths.get(directory.getPath()), extensions);

    final Stream<Video> fileStream = files
            .stream()
            .map(this::convertFileToDocument)

            // This is wrong (doesn't compile for a start), but how do I do something similar or of this nature? 
            .filter(file -> fileRepository.findById(file.getId()));

    return Flux.fromStream(fileStream);
}

convertFileToDocument只是将文件映射到POJO,那里没有有趣的事情发生。

如何根据findById的结果添加过滤器,还是有更好的方法来实现呢?

1 个答案:

答案 0 :(得分:2)

如果fileRepository.findById返回一个Mono,我建议您将流转换为流量,然后使用filterWhen进行过滤;检查Mono是否具有元素。像

final Stream<Video> fileStream = files
        .stream()
        .map(this::convertFileToDocument);
return Flux.fromStream(fileStream).filterWhen(file -> fileRepository.findById(file.getId()).hasElement().map(b -> !b));

这将过滤掉所有返回findById的非空Mono或存在于数据库中的文件。如果我误解了一些东西,请告诉我。