将可迭代项收集到一个变量中(列表)

时间:2018-10-02 13:56:19

标签: kotlin

考虑一下:

  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().???初始化

问题不是关于读取文件或任何东西的最佳方法是什么,而是我如何在执行上述操作的同时更简洁地编写以上代码。

1 个答案:

答案 0 :(得分:2)

您可以为此使用flatMap。首先使用您的映射功能将每个元素映射到Sequence(这样您就可以得到一个Sequence<Sequence<File>>),然后将每个结果都平整到Sequence<File>

由于walkTopDown返回FileTreeWalk(它是Sequence<File>的子类),并且您返回了List<File>,因此也必须进行一些转换。如果您使getFilesreadFiles返回Sequence<File>,则可以删除这些转换。

fun readFiles(directory: String): List<File> {
    return File(directory)
              .walkTopDown()
              .flatMap { getFiles(it).asSequence() }
              .toList()
}