Соберите итерации в одну переменную (список) - PullRequest
0 голосов
/ 02 октября 2018

Учтите это:

  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 голосов
/ 02 октября 2018

Вы можете использовать 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...