1

有谁知道如何在 scala 中创建一个惰性迭代器?

例如,我想通过实例化每个元素进行迭代。通过后,我希望实例死亡/从内存中删除。

如果我像这样声明一个迭代器:

val xs = Iterator(
 (0 to 10000).toArray,
 (0 to 10).toArray,
 (0 to 10000000000).toArray)

它在声明 xs 时创建数组。可以这样证明:

def f(name: String) = {
  val x =  (0 to 10000).toArray
  println("f: " + name) 
  x
}

val xs = Iterator(f("1"),f("2"),f("3"))

打印:

scala> val xs = Iterator(f("1"),f("2"),f("3"))
f: 1
f: 2
f: 3
xs: Iterator[Array[Int]] = non-empty iterator

有人有想法么?

流不适合,因为元素保留在内存中。

注意:我以数组为例,但我希望它适用于任何类型。

4

2 回答 2

2

Scala 集合有一个view方法可以生成集合的惰性等效项。因此,请(0 to 10000).toArray使用(0 to 10000).view. 这样,内存中就不会创建数组。另请参阅https://stackoverflow.com/a/6996166/90874https://stackoverflow.com/a/4799832/90874https://stackoverflow.com/a/4511365/90874等。

于 2013-01-18T10:48:55.940 回答
1

使用一种Iterator接受按名称调用参数的工厂方法。

对于您的第一个示例,您可以执行以下操作之一:

val xs1 = Iterator.fill(3)((0 to 10000).toArray)
val xs2 = Iterator.tabulate(3)(_ => (0 to 10000).toArray)
val xs3 = Iterator.continually((0 to 10000).toArray).take(3)

在您需要它们之前,不会分配数组。

如果您需要为每个元素使用不同的表达式,您可以创建单独的迭代器并将它们连接起来:

val iter = Iterator.fill(1)(f("1")) ++ 
           Iterator.fill(1)(f("2")) ++ 
           Iterator.fill(1)(f("3"))
于 2013-01-18T11:15:57.267 回答