通过将非惰性集合转换为流来进行延迟评估有多容易?

Las*_*asf 3 functional-programming scala scala-2.11

这可能是一个愚蠢的问题,但我已经有一段时间不确定了.让我们假设这遍历我的列表三次:

def doSomething(list: List[Int]): List[Int] =
  list.map(...).flatMap(...).map(...)
Run Code Online (Sandbox Code Playgroud)

如果我改为:

def doSomething(list: List[Int]): List[Int] =
  list.toStream.map(...).flatMap(...).map(...).toList
Run Code Online (Sandbox Code Playgroud)

我保证一次迭代吗?

ntn*_*ntn 5

据我所知,转换为.toStream应该只进行一次迭代.
但是,更为标准的做法是使用.view然后.force最后

def doSomething(list: List[Int]): List[Int] =
  list.view.map(...).flatMap(...).map(...).force
Run Code Online (Sandbox Code Playgroud)

使用.view上一集返回它的懒惰版本,并呼吁.force就懒视图创建集合.

  • 谢谢.谷歌搜索你的答案引导我[这](http://docs.scala-lang.org/tutorials/FAQ/stream-view-iterator.html),这也是非常有帮助的.看起来像`view` /`force`是要走的路.也就是说,我希望能够更详细地解释流与视图的不同之处. (2认同)