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失踪了。我最好希望fourToSix
为List(4, 5, 6)
。我如何使用takeWhile
或类似的操作以使其有效?
答案 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)