我有很多大文件要处理除了每个文件中的最后一行以外的所有文件。如果文件很小,我可以转换为TraversableLike并使用“init”方法,例如:
lines.toList.init
但是文件很大所以我需要将事物保存为迭代器。有没有一种简单的方法可以在迭代器上获得类似“init”的内容?我正在考虑以下内容,但我不相信它会一直有效:
lines.takeWhile(_ => lines.hasNext)
答案 0 :(得分:14)
你首先依靠takeWhile
抓住下一行,然后检查是否还有另一行。它在默认迭代器中以这种方式工作。对于任何特定的迭代器,我希望如果它能够工作,它应该始终有效。
如果失败,您需要缓存结果。您可以创建自己的迭代器,或者更容易(如果这不是紧急的性能关键代码):
lines.sliding(2).map(_.head)
按如下方式测试:
List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList
您不必依赖takeWhile
或以任何特定方式行事的任何其他方法;如果sliding
没有被破坏,它将具有上述行为。
答案 1 :(得分:6)
如果您想跳过前两行,并删除最后4行,则可以使用
进行迭代List(1, 2, 3).toIterable.drop(1).dropRight(1)
如果您已经拥有IterableLike
il.drop(1).dropRight(1)