A feature of Scala that I hadn’t used before was Stream.cons. This allows you to create a stream (essentially, a lazily evaluated list) from a function. So, for doing some work on files based on their position in the directory hierarchy, we can create a list of their parents:
def fileParents(file: File) : Stream[File] = { val parent = file.getParentFile if (parent == null) Stream.empty else Stream.cons(parent, fileParents(parent)) }
and then use standard Scala functionality for filtering and finding things in lists, rather than having to write code that iterates through the parent files manually.