如何使用基于另一个列表的lambda从列表中删除元素

M06*_*06H 20 java lambda java-8 java-stream

我有文件路径列表:.

List<Path> filePaths; //e.g. [src\test\resources\file\15\54\54_exampleFile.pdf]
Run Code Online (Sandbox Code Playgroud)

54 以上是指文件ID

然后,我获得了一个我的应用程序可以处理SetStringID,如下所示:

Set<String> acceptedIds = connection.getAcceptedIDs(); //e.g. elements [64, 101, 33]
Run Code Online (Sandbox Code Playgroud)

如何使用Java 8 lambdas来filter排除filePaths其中不包含acceptedIds集合Set中包含的任何可接受的ID的所有元素.

换句话说,我只想保留filePaths具有acceptedIdsset中的id的路径.例如,54不在上面的列表中,因此被删除.

filePaths.stream().filter(...).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 24

最有效的方法是从路径中提取ID,然后尝试在Set中找到它,使每个过滤器在恒定时间内执行,即O(1)给出一个整体O(n),其中n是路径数:

filePaths.stream()
  .filter(p -> acceptedIds.contains(p.getParent().getFileName().toString()))
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果完成了相反的方法,在acceptedIds路径中搜索每一个(如在其他答案中),每个过滤器是O(m*k),其中m是数量,acceptedIds并且k是平均路径长度,给出整体O(n * m * k),即使是中等也会表现很差收藏品的大小.