我有一个非常“嵌套”的Stream,简化为下面的三个层次: x,y,z。我希望只做一个x a,就可以让y和z的计算变得懒惰:
val stream = for {
x <- List(1, 2, 3).toStream
y <- List("foo", "bar", "baz")
z = {
println("Processed " + x + y)
x + y
}
} yield z
stream take (2) foreach (doSomething)但这将计算所有3个元素,如3个指纹所示。我只想计算前2个数,因为这些都是我从流中获取的。我可以通过对第二个List调用toStream来解决这个问题,依此类推。有没有更好的方法比在for- calling的每一个层次上调用它更好呢?
发布于 2012-03-24 10:57:38
它打印的内容是:
Processed 1foo
Processed 1bar
Processed 1baz
stream: scala.collection.immutable.Stream[String] = Stream(1foo, ?)
scala> stream take (2) foreach (println)
1foo
1barStream的头部总是被严格计算,这就是为什么你看到Processed 1foo etc而不是Processed 2foo等。这是在你创建流时打印出来的,或者更准确地说,是在计算stream头部时打印出来的。
您说得对,如果您只希望一个接一个地处理每个结果元素,那么所有生成器都必须是流。你可以像下面的例子一样,通过让它们成为流的方式来调用toStream。
stream是一个Stream[String],它的头部需要评估。如果您不想急于计算值,您可以在前面加上一个虚拟值,或者更好的做法是将值设置为lazy stream
lazy val stream = for {
x <- Stream(1, 2, 3)
y <- Stream("foo", "bar", "baz")
z = { println("Processed " + x + y); x + y }
} yield z 在获取每个值之前,这不会进行任何“处理”:
scala> stream take 2 foreach println
Processed 1foo
1foo
Processed 1bar
1barhttps://stackoverflow.com/questions/9848135
复制相似问题