让我们定义一个Stream[Int]
元素(1,2,3)
。
scala> val x = Stream(1,2,3)
x: scala.collection.immutable.Stream[Int] = Stream(1, ?)
x
显示为Stream(1, ?)
,因为根据我的理解,它会根据需要进行评估,即在必要时进行评估。
然后,我致电x.last
。
scala> x.last
res0: Int = 3
最后,我再次致电x
以查看其价值。
scala> x
res1: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3)
x
是否等于Stream(1,2,3)
,因为我调用了x.last
,导致所有值的访问(在列表中从左到右)?
答案 0 :(得分:3)
:“Stream类还使用memoization,以便先前计算的值从Stream元素转换为具体值”
另一件可能反直觉的事情似乎是你的流应该是不可变的事实之间的矛盾......但是文档清楚地说“虽然在访问期间实际上正在修改Stream,但这并没有改变它的不变性。一旦价值被记忆,它们就不会改变,而尚未被记忆的价值仍然“存在”,它们还没有实现。“ (摘自:http://www.scala-lang.org/api/current/scala/collection/immutable/Stream.html)
所以换句话说你是对的=)