我正在尝试编写多级过滤器。我有文件夹和文件。
public class Folder {
String name;
List<Folder> folders;
List<File> files;
...
}
public class File {
String name;
String type;
...
}
我需要一个寻找某些属性的过滤器,例如name,可以是文件夹/文件名。我编写了一段适用于一个级别的代码,但我不知道如何才能找到两级循环。
最终结果将是一个文件夹列表:名称与“名称过滤器”匹配的文件夹列表。或文件名与过滤器匹配的文件夹。
List<Folder> result = folders.stream()
.filter(folder -> folder.getFiles().stream().anyMatch(file -> file.getName().contains(filter)))
.collect(Collectors.toList());
答案 0 :(得分:3)
我认为最好在Folder类中添加一个帮助器方法,将嵌套文件夹递归地压缩为Stream:
class Folder {
String name;
List<Folder> folders;
List<File> files;
Stream<Folder> flatten() {
return Stream.concat(Stream.of(this), folders.stream().flatMap(Folder::flatten));
}
}
之后,您可以使用flatMap(...)
List<Folder> result = folders.stream()
.flatMap(Folder::flatten)
.filter(folder -> folder.getFiles()
.stream()
.anyMatch(file -> file.getName().contains(filter)))
.collect(Collectors.toList());
答案 1 :(得分:0)