Все, кроме последнего элемента из Scala Iterator (a.k.a. Iterator.init)

У меня есть несколько больших файлов, где я хочу обрабатывать все, кроме последней строки в каждом файле. Если файлы были небольшими, я мог бы просто преобразовать в TraversableLike и использовать метод "init", например:

lines.toList.init

Но файлы большие, поэтому мне нужно хранить вещи как итератор. Есть ли простой способ получить что-то вроде "init" на Iterator? Я рассматриваю следующее, но я не уверен, что он всегда будет работать:

lines.takeWhile(_ => lines.hasNext)

Ответы

Ответ 1

Вы полагаетесь на takeWhile сначала на захват следующей строки, а затем на проверку, есть ли другая строка. Это работает в итераторе по умолчанию. И для любого конкретного итератора я ожидаю, что если он когда-нибудь будет работать, он всегда должен работать.

Если это когда-либо терпит неудачу, вам нужно кэшировать результат. Вы можете сделать свой собственный итератор, который сделает это, или, что более легко (если это не срочно критически важный код):

lines.sliding(2).map(_.head)

Проверьте это следующим образом:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList

Вам не нужно полагаться на takeWhile или какой-либо другой метод, ведущий какой-либо конкретный способ; если sliding не сломано, оно будет иметь вышеприведенное поведение.

Ответ 2

Если вы хотите пропустить первые 2 строки и отбросить последние 4, вы можете выполнить итерацию с помощью

List(1, 2, 3).toIterable.drop(1).dropRight(1)

Если у вас уже есть IterableLike

il.drop(1).dropRight(1)