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

标签 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 );
    }
}

开始使用流以了解如何使用流。

最佳答案

问题是您总是从 filter 返回 true

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());

关于java - 如何使用流相互检查两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572506/

相关文章:

java - 调用静态方法/字段

java - 如何以编程方式为选定的实体字段绑定(bind) Hibernate 类型?

java - 使用 Java 比较器按另一个列表对对象列表进行排序

java - 从 Java 8 中的 Double 流中收集 Long 列表

java - Java中列表列表中的最大值

java - 如何使用流、Map<String, Object> 按包含键的 List<String> 进行过滤

java - ImageJ(Java插件): auto threshold method doesn't work

java - Eclipse 导入的快捷键

java - 无法将字符串解析为 Java 8 LocalDateTime

java - 是否可以缩写java函数来删除变量?