人们真的在生产代码中使用Scala的Stream类,还是主要是学术兴趣?
答案 0 :(得分:4)
Stream
没有问题,除非人们使用它来替换{{1}} - 而不是替换Iterator
,这是与它最相似的集合。在这种特殊情况下,人们必须小心使用它。另一方面,也必须小心使用List
,因为每个元素只能迭代一次。
所以,既然两者都有自己的问题,为什么单挑Iterator
?我敢说,人们习惯于从Stream
使用Java,而Iterator
则是功能性的。
答案 1 :(得分:3)
即使我写了 Iterator is what I want to use nearly all the time ,我也会在生产代码中使用Stream
。我只是不自动假设细胞是垃圾收集。
有时Stream
完全符合问题。我认为api给出some good examples涉及递归的地方......
答案 2 :(得分:3)
看here。这篇博客文章描述了如何使用Scala Streams(以及内存映射文件)有效地读取大文件(1-2G)。
我还没试过,但解决方案看起来很合理。 Stream在低级ByteBuffer
Java API之上提供了一个很好的抽象,可以将内存映射文件作为一系列记录来处理。
答案 3 :(得分:2)
是的,我使用它,虽然它往往是这样的:
(as.toStream collect expensiveConversionToB) match {
case b #:: _ => //found my expensive b
case _ =>
}
当然,我可能会使用非严格视图和find
这个例子
答案 4 :(得分:1)
由于不使用Stream
的唯一原因是确保JVM没有保留对早期conses的引用可能很棘手,我使用的一种方法相当不错就是建立一个Stream
并立即将其转换为Iterator
以供实际使用。它在使用方面失去了一些Stream
的优良属性,特别是在回溯方面,但是如果你只想对结果进行一次传递,那么通过这种方式构建结构通常比扭曲更容易直接进入hasNext
的{{1}} / next()
模型。