据我所知,Stream
保留了最近计算的元素。我猜它没有保留所有计算的元素(这是不可行的),所以它可能使用一些内部"缓存"。
正确吗?我可以控制这个缓存的大小和策略吗?
流就像列表一样,根据需要生成自己的成员。一旦元素被生成,它将保留在流中并被重用。
例如: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
Stream-object保留到目前为止已经计算/访问过的所有引用。Stream
像List
一样工作。每个可以从保存引用访问到的元素,并且至少已经被访问过一次,都不会被垃圾收集。
基本上你的指向流的指针和你到目前为止求值的内容定义了将被缓存的内容