Мне нравится решение потока yura, но оно (и другие) переписывается в скрытые каталоги. Мы также можем упростить, используя тот факт, что listFiles
возвращает null для некаталога.
def tree(root: File, skipHidden: Boolean = false): Stream[File] =
if (!root.exists || (skipHidden && root.isHidden)) Stream.empty
else root #:: (
root.listFiles match {
case null => Stream.empty
case files => files.toStream.flatMap(tree(_, skipHidden))
})
Теперь мы можем перечислить файлы
tree(new File(".")).filter(f => f.isFile && f.getName.endsWith(".html")).foreach(println)
или реализовать весь поток для последующей обработки
tree(new File("dir"), true).toArray
ВНИМАНИЕ: Я побежал этот код, а иногда и f.listFiles возвращает значение null (не знаю, почему, но на моем mac оно делает) и recursiveListFiles функция cr пепел. Я недостаточно опытен, чтобы построить элегантную нулевую проверку в scala, но возвращая пустой массив, если эти == null работали для меня. – Jan
@Jan - 'listFiles' возвращает' null', если 'f' не указывает на каталог или если есть ошибка ввода-вывода (по крайней мере, согласно спецификации Java). Добавление нулевой проверки, вероятно, разумно для использования в производстве. –
@Rex Возможно, лучше, чем проверка «null», будет иметь проверку на работоспособность, что 'f' является каталогом в начале функции. Это поможет с удобочитаемостью, поскольку смысл проверки будет очень ясным. Например: 'if (! F.isDirectory) return Array()' –