在迭代器中的Scala懒惰元素

时间:2013-01-18 10:34:29

标签: scala

有没有人知道如何在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

有人有什么想法吗?

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

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

1 个答案:

答案 0 :(得分: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等。