考虑一下:
fun readFiles(directory: String): List<File> {
val result = ArrayList<File>()
File(directory).walkTopDown().forEach {
result.addAll(getFiles(it))
}
return result
}
fun getFiles(file: File): List<File> { ... }
如何重写它,这样我就不必初始化result
ArrayList
而是可以直接return File(directory).walkTopDown().???
初始化
问题不是关于读取文件或任何东西的最佳方法是什么,而是我如何在执行上述操作的同时更简洁地编写以上代码。
答案 0 :(得分:2)
您可以为此使用flatMap
。首先使用您的映射功能将每个元素映射到Sequence
(这样您就可以得到一个Sequence<Sequence<File>>
),然后将每个结果都平整到Sequence<File>
。
由于walkTopDown
返回FileTreeWalk
(它是Sequence<File>
的子类),并且您返回了List<File>
,因此也必须进行一些转换。如果您使getFiles
和readFiles
返回Sequence<File>
,则可以删除这些转换。
fun readFiles(directory: String): List<File> {
return File(directory)
.walkTopDown()
.flatMap { getFiles(it).asSequence() }
.toList()
}