代码之家  ›  专栏  ›  技术社区  ›  fweigl

将iterables收集到一个变量(列表)

  •  0
  • fweigl  · 技术社区  · 6 年前

    考虑一下:

      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 回复  |  直到 6 年前
        1
  •  2
  •   marstran    6 年前

    你可以使用 flatMap 为此目的。它首先将每个元素映射到 Sequence 使用你的映射函数 Sequence<Sequence<File>> ,然后将每个结果变平为 Sequence<File> .

    自从 walkTopDown 返回A FileTreeWalk (属于 序列文件 ,然后返回 List<File> ,您还必须进行一些转换。如果您 getFiles readFiles 返回A 序列文件 相反。

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