Kotlin - только чтение первых n строк в файле - PullRequest
0 голосов
/ 13 октября 2018

Есть ли способ, без разрешения традиционного Java-подобного цикла for, ограничить число строк, читаемых BufferedReader?

Взять этот код, например:

bufferedReader.useLines { it }
            .take(10)
            .toList()

документация для useLines состояний:

Вызывает обратный вызов [block], давая ему последовательность всех строк в этом файле, и закрывает читатель, как только * обработка завершена.

Насколько я понимаю, это означает, что весь файл будет прочитан, и только тогда первые десять будут отфильтрованы из последовательности.Я не смог найти в Интернете ничего, касающегося этой проблемы, кроме выборки только первой строки.

1 Ответ

0 голосов
/ 13 октября 2018

Sequence - лениво оцененная коллекция.Это означает, что будут обработаны только необходимые элементы, поэтому, если вы take(10), будут обработаны только первые 10 строк.

Таким образом, ключевое слово в документации:

Звонкиобратный вызов [block] дает ему последовательность всех строк в этом файле и закрывает читатель после завершения обработки.

Now useLines закрывает источник, как толькокак его блок завершен, что делает ваш код неверным.Вместо этого используйте следующее:

val list : List<String> = bufferedReader
    .useLines { lines: Sequence<String> ->
        lines
            .take(10)
            .toList()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...