我对特征 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/

10-14 08:58