Scala Iterator.takeWhile正在删除失败的元素

时间:2017-12-08 15:45:45

标签: scala iterator

val i = (1 to 8).toIterator
val oneToThree = i.takeWhile(_ <= 3).toList
// List(1, 2, 3)

到目前为止一切顺利。 现在我希望迭代器仍然包含(3, 4, 5, 6, 7, 8),但如果我继续:

val fourToSix = i.takeWhile(_ <= 6).toList
// List(5, 6)

元素3失踪了。我最好希望fourToSixList(4, 5, 6)。我如何使用takeWhile或类似的操作以使其有效?

1 个答案:

答案 0 :(得分:5)

请注意takeWhile上的文档说明:

  

重用:调用此方法后,应该丢弃迭代器   被调用,并只使用返回的迭代器。使用   旧迭代器未定义,可能会发生变化,并可能导致   也改变了新的迭代器。

因此,在调用i之后,您不应该使用takeWhile

但要实现您的目标,您可以使用span方法:

scala> val i = (1 to 8).iterator
i: Iterator[Int] = non-empty iterator

scala> val (oneToThree, rest) = i.span(_ <= 3)
oneToThree: Iterator[Int] = non-empty iterator
rest: Iterator[Int] = unknown-if-empty iterator

scala> oneToThree.toList
res1: List[Int] = List(1, 2, 3)

scala> val fourToSix = rest.takeWhile(_ <= 6)
fourToSix: Iterator[Int] = non-empty iterator

scala> fourToSix.toList
res2: List[Int] = List(4, 5, 6)