2015-11-06 67 views
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 

我保证一个迭代?

回答

5

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

def doSomething(list: List[Int]): List[Int] = 
    list.view.map(...).flatMap(...).map(...).force 

在集合上使用.view返回一个懒惰的版本的它,就懒观呼唤.force创建集合。

+2

谢谢。谷歌搜索你的答案让我[this](http://docs.scala-lang.org/tutorials/FAQ/stream-view-iterator.html),这也是非常有用的。看起来像'view' /'force'是要走的路。也就是说,我会喜欢更详细地解释流如何与视图不同的东西。 – Lasf