Java 以反应式方式从数据库中已有的流中删除对象

Java 以反应式方式从数据库中已有的流中删除对象,java,java-stream,reactive-programming,flux,spring-webflux,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

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

尝试以反应式的方式,使用反应式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);
}
@覆盖
公共流量FindFile(目录){
//只获取这些文件类型,因为我们无法处理任何其他文件
最终谓词扩展=路径->
path.toString().endsWith(“.txt”)||
path.toString().endsWith(“.doc”)||
path.toString().endsWith(“.pdf”);
最终设置文件=fileService.findAll(path.get(directory.getPath()),扩展名);
最终流fileStream=文件
.stream()
.map(此::convertFileToDocument)
//这是错误的(不是一开始就编译的),但是我如何做类似的事情呢?
.filter(file->fileRepository.findById(file.getId());
返回通量.fromStream(fileStream);
}
convertFileToDocument
只是将文件映射到POJO,没有什么有趣的事情发生


如何根据
findById
的结果添加过滤器,或者有更好的方法来实现这一点

如果
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));
final Stream fileStream=文件
.stream()
.map(此::convertFileToDocument);
返回Flux.fromStream(fileStream).filterWhen(file->fileRepository.findById(file.getId()).haseElement().map(b->!b));

这将过滤掉为
findById
返回非空Mono或存在于数据库中的所有文件。如果我误解了什么,请让我知道。

我认为这几乎是正确的,我只需要把它颠倒过来。。。我想从
fileStream
中删除数据库中的所有元素。据我所知,这仍然在处理数据库中已经存在的元素。除非我实现了一些错误的东西。我已经更改了答案,将Mono从
hasElement
反转,这样它就过滤掉了数据库中所有已经锁定它的文件。谢谢你!