【问题标题】:How easy is lazy evaluation by converting a non-lazy collection to a stream?通过将非惰性集合转换为流,惰性求值有多容易?
【发布时间】:2015-11-06 04:27:49
【问题描述】:
这可能是一个愚蠢的问题,但我已经有一段时间不确定了。让我们假设这对我们的列表进行了 3 次迭代:
def doSomething(list: List[Int]): List[Int] =
list.map(...).flatMap(...).map(...)
如果我这样做:
def doSomething(list: List[Int]): List[Int] =
list.toStream.map(...).flatMap(...).map(...).toList
我能保证一次迭代吗?
【问题讨论】:
标签:
scala
functional-programming
scala-2.11
【解决方案1】:
据我所知,转换为 .toStream 应该只进行一次迭代。
不过,更标准的做法是使用.view,最后使用.force
def doSomething(list: List[Int]): List[Int] =
list.view.map(...).flatMap(...).map(...).force
在集合上使用 .view 会返回它的惰性版本,在惰性视图上调用 .force 会创建集合。
【讨论】:
-
谢谢。谷歌搜索你的答案将我带到this,这也很有帮助。看起来view/force 是要走的路。也就是说,我希望能更详细地解释流与视图的不同之处。