使用Stream作为循环的替代

时间:2013-05-23 16:27:18

标签: scala

scala> val s = for(i <- (1 to 10).toStream) yield { println(i); i }
1
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> s.take(8).toList
2
3
4
5
6
7
8
res15: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)

scala> s.take(8).toList
res16: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)

看起来Scala正在将流值存储在内存中以优化访问。这意味着Stream不能用作命令循环的替代,因为它将分配内存。像(for(i <- (1 to 1000000).toStream, j <- (1 to 1000000).toStream) yield ...).reduceLeft(...)这样的东西会因为记忆而失败。以这种方式使用流是不对的想法?

1 个答案:

答案 0 :(得分:5)

如果你想要一个类似循环的集合构造,你应该使用Iterator而不是StreamStream专门用于存储过去结果的时间。如果不这样做,那么,例如:

scala> Iterator.from(1).map(x => x*x).take(10).sum
res23: Int = 385

方法continuallyiteratetabulate是这方面更有用的方法(在Iterator随播广告对象中)。