[英]How to check two arrays against each other using streams
我有一个应用程序的数组列表,我有一个目录,它只包含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[]
。 可以通过map(File::getName)
将File
数组映射到文件名,并将它们收集到一个集合中以供进一步查找。
然后,您将拥有以下内容
List<Application> verifiedApps =
App.getAppStore()
.stream()
.filter(o -> filesNames.contains(o.getName() + ".jar"))
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.