У меня есть несколько больших файлов, где я хочу обрабатывать все, кроме последней строки в каждом файл. Если файлы были небольшими, я мог бы просто преобразовать в TraversableLike и использовать метод "init", например:
lines.toList.init
Но файлы большие, поэтому мне нужно сохранить итератор. Есть ли простой способ получить что-то вроде «init» на итераторе? Я рассматриваю следующее, но я не уверен, что это всегда будет работать:
lines.takeWhile(_ => lines.hasNext)
Вы полагаетесь на то, что takeWhile
сначала захватывает следующую строку, а затем проверяет, есть ли другая строка. Это действительно работает в итераторе по умолчанию. И я ожидаю, что для любого конкретного итератора, если он когда-либо сработает, он всегда должен работать.
Если когда-нибудь произойдет сбой, вам нужно будет кэшировать результат.Вы можете создать свой собственный итератор, который сделает это, или, что проще (если это не критичный для производительности код):
lines.sliding(2).map(_.head)
Проверьте это следующим образом:
List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList
Вам не нужно полагаться на takeWhile
или любой другой метод, ведущий себя определенным образом; если скольжение
не прервано, он будет вести себя так, как описано выше.