我对特征 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
显然,第 2 步消耗了两个项目,但在第 3 步中,Iterator
仍然是第一个项目。查看实现,我看不到任何类型的复制或缓冲,只有一个新的 Iterator
委托(delegate)给底层的。怎么可能?我怎样才能真正消耗 n 件物品? 最佳答案
有问题的迭代器在 IndexedSeqLike#Elements
( source ) 中定义。关于 take
在不同迭代器实现中的不一致行为的 ticket was recently filed。
要真正消耗 N 个项目,请调用 Iterator#next
N 次。
您可能需要考虑使用 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))
关于scala - 使用 Scala 迭代器中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7619642/