我有文件路径列表:。

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来filterfilePaths中不包含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),其中macceptedIds的数量,而k是平均Path长度,给出了整个O(n * m * k),即使是中等大小的 Collections ,效果也很差。

10-04 10:14