2015-11-06 54 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