2011-03-19 79 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的基础上提供了一个很好的抽象,用于将内存映射文件处理为一系列记录。