您实际上是在破坏当前的Iterator 并获得 2 个新的作为回报。我认为将Iterator 销毁一次并将其放入Seq 中,从那里获取迭代器会更有效(这只是一种直觉,我没有对其进行标记)。
def getNIterators[A](it: Iterator[A], n: Int) : Seq[Iterator[A]] = {
val seq = it.toSeq
Seq.fill(n)(seq.iterator)
}
您可能想在此处阅读duplicate 的问题:How to copy iterator in Scala? 和此处:How to clone an iterator?
编辑:
好吧,如果您不想在一开始就使用整个迭代器,请考虑使用Stream
def getNIterators[A](it: Iterator[A], n: Int) : Seq[Iterator[A]] = {
val seq = it.toStream
Seq.fill(n)(seq.iterator)
}
它会根据需要消耗Iterator(除了头部,会立即消耗),所有Iterators都是独立的。
scala> (1 to 4).iterator.map(s => {println(s); s})
res12: Iterator[Int] = non-empty iterator
scala> getNIterators(res12, 4)
1
res13: Seq[Iterator[Int]] = List(non-empty iterator, non-empty iterator, non-empty iterator, non-empty iterator)
scala> res13.map(_.next)
res14: Seq[Int] = List(1, 1, 1, 1)
scala> res13.map(_.next)
2
res15: Seq[Int] = List(2, 2, 2, 2)
scala> res13.map(_.next)
3
res16: Seq[Int] = List(3, 3, 3, 3)
scala> res13.map(_.next)
4
res17: Seq[Int] = List(4, 4, 4, 4)