gpt4 book ai didi

scala - 使用 Scala 迭代器中的项目

转载 作者:行者123 更新时间:2023-12-04 00:57:07 25 4
gpt4 key购买 nike

我对方法的行为感到困惑 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)。一个 ticket was recently filed关于 take 的不一致行为跨不同的迭代器实现。

真正消费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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com