jgl*_*tre 12 iterator scala scala-collections
我对take特质中方法的行为感到困惑Iterator.它似乎不消耗物品.这是一个例子:
scala> Iterator(1,2,3)
res0: Iterator[Int] = non-empty iterator
scala> res0 take 2 toArray
res1: Array[Int] = Array(1, 2)
scala> res0.next
res2: Int = 1
Run Code Online (Sandbox Code Playgroud)
显然,步骤2消耗两个项目,但在步骤3 Iterator中仍然是第一个项目.看看实现,我看不到任何类型的复制或缓冲,只是一个新的Iterator委托给底层的.怎么可能呢?我怎样才能真正消耗n个物品?
ret*_*nym 11
有问题的迭代器在IndexedSeqLike#Elements(source)中定义.一票在最近提交的有关的不一致行为take在不同的迭代器实现的.
要真正消耗N个项目,请调用Iterator#nextN次.
您可能想要考虑使用Stream,这是一个懒惰(像Iterator),但也是不可变的(不像Iterator).
scala> val s = Stream(1, 2, 3)
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> s.take(2).toList
res43: List[Int] = List(1, 2)
scala> s.take(2).toList
res44: List[Int] = List(1, 2)
scala> s.drop(2).toList
res45: List[Int] = List(3)
scala> {val (s1, s2) = s.splitAt(2); (s1.toList, s2.toList)}
res46: (List[Int], List[Int]) = (List(1, 2),List(3))
Run Code Online (Sandbox Code Playgroud)