如何使用流检查两个阵列

Jaq*_*arh 5 java filtering java-8 java-stream

我有一个应用程序的数组列表,我有一个目录,它只包含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();
Run Code Online (Sandbox Code Playgroud)

然而,这给了我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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

使用流来习惯了解如何使用流.

And*_*lko 4

问题是你总是true从回来filter

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

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

然后,你将得到以下内容

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

  • @KDOT 关于 Java 文档中的收集器:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html 和 https://docs.oracle.com/javase/8/文档/api/java/util/stream/Collector.html (3认同)
  • @KDOT 很乐意提供帮助 (2认同)