我有文件路径列表:。
List<Path> filePaths; //e.g. [src\test\resources\file\15\54\54_exampleFile.pdf]
上面的
54
是指文件ID然后,我获得了
Set
Ids的String
,我的应用程序可以按以下方式对其进行处理:Set<String> acceptedIds = connection.getAcceptedIDs(); //e.g. elements [64, 101, 33]
我如何使用Java 8 lambda来
filter
出filePaths
中不包含acceptedIds
集合集中包含的任何可接受ID的所有元素。换句话说,我只想在
filePaths
中保留ID为acceptedIds
集中的路径。例如,54不在上面的列表中,因此将其删除。filePaths.stream().filter(...).collect(Collectors.toList());
最佳答案
最有效的方法是从路径中提取ID,然后尝试在Set中找到它,使每个过滤器在恒定的时间内执行,即O(1)
提供总体O(n)
,其中n
是路径数:
filePaths.stream()
.filter(p -> acceptedIds.contains(p.getParent().getFileName().toString()))
.collect(Collectors.toList());
如果采取了相反的方法,则在路径中搜索每个
acceptedIds
(与其他答案一样),每个过滤器为O(m*k)
,其中m
是acceptedIds
的数量,而k
是平均Path长度,给出了整个O(n * m * k)
,即使是中等大小的 Collections ,效果也很差。