Java 如何使用流相互检查两个阵列

Java 如何使用流相互检查两个阵列,java,java-8,java-stream,filtering,Java,Java 8,Java Stream,Filtering,我有一个应用程序的数组列表,我有一个只包含jar文件的目录(我在我的平台上使用反射来访问这些jar文件)。我想遍历目录中的所有文件,找到所有jar文件,然后检查它们是否是已验证应用程序数组列表的一部分,并从中构建一个新的已验证和存在的应用程序数组列表 到目前为止,我有: App.getAppStore() .stream() .filter(o -> { File[] listOfFiles = new File("C:/Temp/MyApps/").listFi

我有一个应用程序的数组列表,我有一个只包含jar文件的目录(我在我的平台上使用反射来访问这些jar文件)。我想遍历目录中的所有文件,找到所有jar文件,然后检查它们是否是已验证应用程序数组列表的一部分,并从中构建一个新的已验证和存在的应用程序数组列表

到目前为止,我有:

App.getAppStore()
   .stream()
   .filter(o -> {
       File[] listOfFiles = new File("C:/Temp/MyApps/").listFiles();
       Object[] foo = Arrays.stream(listOfFiles)
                            .filter(x -> x.getName().contains(o.getName()))
                            .toArray();

       return true;
}).toArray();
然而,这给了我arraylist中的所有内容,即使它们不存在于文件中。任何帮助将不胜感激,我想使用流

我想谈谈这个问题:

ArrayList<Application> verifiedApps = new ArrayList<verifiedApps>();
for( Application app : App.getAppStore() ) {
    for( File verifiedApp : new File("C:/Temp/MyApps/").listFiles() ) {
        if( verifiedApp.getName().contains( app.getName() )
            verifiedApps.add( app );
    }
}
ArrayList verifiedApps=new ArrayList();
对于(应用程序app:app.getAppStore()){
对于(文件验证应用:新文件(“C:/Temp/MyApps/”).listFiles()){
如果(verifiedApp.getName()包含(app.getName())
已验证的apps.add(app);
}
}

使用流来习惯如何使用流。

问题是您总是从
过滤器
返回
true

File[] listOfFiles = new File("C:/Temp/MyApps/").listFiles();
Set<String> filesNames = Arrays.stream(listOfFiles)
                               .map(File::getName)
                               .collect(Collectors.toSet());

谢谢Andrew!这非常有效!您能解释一下这是如何工作的吗?或者提供我可以查看的参考资料吗?当我研究这一点时,我找不到任何关于使用
收集器的信息。我会在可能的时候标记答案!@KDOT关于Java文档中的收集器:@KDOT很乐意提供帮助,因为
filenames
不是一个单独的名称字符串时,
.contains()
在传递
o.getName()
时查找绝对匹配。因此,请确保同时传递文件扩展名:
filesNames.contains(o.getName()+“.jar”)
。我遇到了这个问题,但按照我看到的解决了它,但只是为未来的观众发表了评论。我更愿意使用
Set filenames=Files.list(Paths.get(“C:/Temp/MyApps/”)))).map(p->p.getFileName()+“.jar”).collector(Collectors.toSet();
后跟
list verifiedApps=apps.getAppStore().stream().filter(o->->filenames.contains)(o.getName()).collect(collector.toList());
List<Application> verifiedApps = 
    App.getAppStore()
       .stream()
       .filter(o -> filesNames.contains(o.getName() + ".jar"))
       .collect(Collectors.toList());