首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套的惰性for-comprehension

嵌套的惰性for-comprehension
EN

Stack Overflow用户
提问于 2012-03-24 08:43:01
回答 1查看 2.3K关注 0票数 2

我有一个非常“嵌套”的Stream,简化为下面的三个层次: x,y,z。我希望只做一个x a,就可以让y和z的计算变得懒惰:

代码语言:javascript
复制
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的每一个层次上调用它更好呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-24 10:57:38

它打印的内容是:

代码语言:javascript
复制
Processed 1foo
Processed 1bar
Processed 1baz
stream: scala.collection.immutable.Stream[String] = Stream(1foo, ?)

scala> stream take (2) foreach (println)
1foo
1bar

Stream的头部总是被严格计算,这就是为什么你看到Processed 1foo etc而不是Processed 2foo等。这是在你创建流时打印出来的,或者更准确地说,是在计算stream头部时打印出来的。

您说得对,如果您只希望一个接一个地处理每个结果元素,那么所有生成器都必须是流。你可以像下面的例子一样,通过让它们成为流的方式来调用toStream

stream是一个Stream[String],它的头部需要评估。如果您不想急于计算值,您可以在前面加上一个虚拟值,或者更好的做法是将值设置为lazy stream

代码语言:javascript
复制
lazy val stream = for {
  x <- Stream(1, 2, 3)
  y <- Stream("foo", "bar", "baz")
  z = { println("Processed " + x + y); x + y }
} yield z 

在获取每个值之前,这不会进行任何“处理”:

代码语言:javascript
复制
scala> stream take 2 foreach println
Processed 1foo
1foo
Processed 1bar
1bar
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9848135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档