如何使用流互相检查两个数组

时间:2018-09-29 21:00:40

标签: java java-8 java-stream filtering

我有一个应用程序数组列表,我的目录仅包含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 );
    }
}

开始使用流来习惯于知道如何使用流。

1 个答案:

答案 0 :(得分:4)

问题是您总是从true返回filter

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

可以将其移到filter lambda之外,以避免为每个应用创建File[]File可以将map(File::getName)的数组映射到文件名,并将它们收集到一个集中以供进一步查找。

然后,您将获得以下内容

List<Application> verifiedApps = 
    App.getAppStore()
       .stream()
       .filter(o -> filesNames.contains(o.getName() + ".jar"))
       .collect(Collectors.toList());