Scala Iterator(又名Iterator.init)中的最后一项除外

Ste*_*eve 17 iterator scala

我有许多大文件,我想处理除了每个文件中的最后一行以外的所有文件.如果文件很小,我可以转换为TraversableLike并使用"init"方法,例如:

lines.toList.init
Run Code Online (Sandbox Code Playgroud)

但是文件很大所以我需要将事物保存为迭代器.有没有一种简单的方法可以在迭代器上获得类似"init"的内容?我正在考虑以下内容,但我不相信它会一直有效:

lines.takeWhile(_ => lines.hasNext)
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 14

你依靠takeWhile首先抓住下一行,然后检查是否还有另一行.它在默认迭代器中以这种方式工作.对于任何特定的迭代器,我希望如果它能够工作,它应该始终有效.

如果它失败了,你需要缓存结果.您可以创建自己的迭代器,或者更容易(如果这不是紧急的性能关键代码):

lines.sliding(2).map(_.head)
Run Code Online (Sandbox Code Playgroud)

测试如下:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList
Run Code Online (Sandbox Code Playgroud)

您不必依赖takeWhile任何特定方式的任何其他方法; 如果sliding没有破坏,它将具有上述行为.


rai*_*tin 7

如果你想跳过前两行,并删除最后4行,你可以迭代

List(1, 2, 3).toIterable.drop(1).dropRight(1)
Run Code Online (Sandbox Code Playgroud)

如果你已经有了IterableLike

il.drop(1).dropRight(1)
Run Code Online (Sandbox Code Playgroud)