据我了解,Stream
保留了最近评估过的元素。我想它不会保留所有评估的元素(这是不可行的),所以它可能使用了一些内部“缓存”。
这是对的吗?我可以控制此缓存的大小和策略吗?
答案 0 :(得分:12)
Streams就像列表一样,可以根据需要生成成员。生成元素后,它将保留在流中并重新使用。
例如:
lazy val naturals: Stream[Int] = Stream.cons(0, naturals.map{_ + 1})
将为您提供自然数字流。如果我打电话
naturals(5)
如果我再调用
,它将生成元素0-5并返回5naturals(8)
它将重用前6个元素并再生成3个元素。
如果您担心内存使用情况,可以使用Stream.drop(num)
生成从开头删除num
元素的新流,允许使用旧流对截断的元素进行垃圾回收。例如:
naturals(5) //returns 5
val truncated = naturals.drop(4)
truncated(5) //returns 9
答案 1 :(得分:6)
Stream-object保留到目前为止已评估/访问的所有引用。 Stream
的作用类似于List
。从保留的引用中可以访问的每个元素,以及至少已经访问过一次的元素,都不会被垃圾回收。
所以基本上你指向流的指针以及你目前评估的内容定义了什么将被缓存。