2011-03-19 78 views
7

人們是否真的在生產代碼中使用Scala的Stream類,還是主要關注學術興趣?產品代碼流

+1

「Stream」讓你問這個問題有什麼特別之處?爲什麼不能在生產代碼中使用它? – Madoc 2011-03-19 16:07:42

+1

很容易耗盡人體內存。我似乎還記得,它的實施正在顯示它的年齡。所以我只是很好奇人們是否真的將它用於歐拉項目之外的事情。 ;) – 2011-03-19 16:10:41

回答

4

有沒有問題Stream,除非人們用它來代替Iterator - 而不是替代List,這是最相似的集合。在這種情況下,人們在使用時必須小心。另一方面,使用Iterator也必須小心,因爲每個元素只能迭代一次。

那麼,既然都有自己的問題,爲什麼單挑出來Stream的?我敢說,人們習慣於Java的Iterator,而Stream是一個功能性的東西。

+0

好吧,Stream似乎有它的問題,比如在reduceLeft中使用時。 – 2011-03-20 08:46:14

+0

這個問題很多很好的答案;這對我來說是最有幫助的,因爲我不太喜歡像使用List而不是迭代器那樣使用它是正確的方法。感謝所有回覆的人。 – 2011-03-25 13:03:59

2

是的,我用它,但它往往是這樣的:

(as.toStream collect expensiveConversionToB) match { 
    case b #:: _ => //found my expensive b 
    case _  => 
} 

當然,我可能會使用一個非嚴格的觀點,並在這個例子中

+0

我猜測是什麼促使我認識到Stream在內存使用方面非常脆弱,除非沒有其他方式,否則我會不寒而慄在生產代碼中找到它。 – 2011-03-19 20:34:59

1

一個find由於唯一不使用Stream的理由是,確保JVM不保留對早期論點的引用可能非常棘手,我使用的一種方法相當不錯,就是建立一個Stream並立即將其轉換爲Iterator實際使用。在使用方面它會失去一點Stream的好特性,特別是在回溯方面,但是如果你只想對結果進行一次傳遞,那麼通過這種方式構建結構往往比扭曲進入hasNext/next()模型Iterator直接。

3

Look here。本博客文章介紹瞭如何使用Scala Streams(以及內存映射文件)高效地讀取大文件(1-2G)。

我還沒試過,但解決方案看起來很合理。 Stream在低級別API的基礎上提供了一個很好的抽象,用於將內存映射文件處理爲一系列記錄。