问题标签 [scala-streams]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
337 浏览

scala - Scala中的延迟分页(迭代器的流/迭代器?)

我通过调用一次一页(每页的记录数未知)从数据库API顺序读取大量记录def readPage(pageNumber: Int): Iterator[Record]

我试图以一种功能性的方式将这个 API 包装成类似Stream[Iterator[Record]]或者Iterator[Iterator[Record]]懒惰的方式,理想情况下没有可变状态,具有恒定的内存占用,这样我就可以将它视为无限的页面流或迭代器序列,并抽象掉来自客户端的分页。客户端可以迭代结果,通过调用 next() 它将检索下一页 (Iterator[Record])。

在 Scala 中实现这一点的最惯用和最有效的方法是什么。

编辑:需要一次一页地获取和处理记录,无法维护内存中所有页面的所有记录。如果一页失败,则抛出异常。大量页面/记录对于所有实际目的来说意味着无限。我想将它视为页面的无限流(或迭代器),每个页面都是有限数量记录的迭代器(例如,小于<1000,但如果时间提前,确切数量未知)。

我在Monix中查看了 BatchCursor,但它有不同的用途。

编辑 2:这是使用以下 Tomer 的答案作为起点的当前版本,但使用 Stream 而不是 Iterator。这允许根据https://stackoverflow.com/a/10525539/165130消除尾递归的需要,并且有 O(1) 时间进行流前置#::操作(如果我们通过++操作连接迭代器,它将是 O (n))

注意:虽然流被延迟评估,但流记忆仍可能导致内存爆炸,并且内存管理变得棘手val从to更改为def在下面定义 Streamdef pages = readAllPages似乎没有任何效果

编辑 3:Tomer 的第二个建议似乎是最好的,它的运行时和内存占用与上述解决方案类似,但更简洁且容易出错。

注意: Stream.from(1)创建一个从 1 开始并以 1 递增的流,它在API 文档中

0 投票
1 回答
71 浏览

scala - 使用 scala 生成句子使用流

我想使用 Stream 生成多个句子。我现在拥有的是我可以生成 1 个句子。

这是我到目前为止的结果

现在如果我想取2个句子,流将继续写入第一个句子

现在我如何在该流中生成多个句子到一个数组(或一个列表)中。?

我想过将类型更改为,Stream[List[String]]但我不知道如何以正确的方式添加生成的(它给了我Exception in thread "main" java.lang.StackOverflowError

使用 Stream[List[String]] 代码:

我写的原始代码

0 投票
1 回答
62 浏览

scala - 为什么 Source.fromInputStream 使用 GZIPInputStream 而不是 ZipInputStream

我正在尝试流式传输 zip 文件。

以下代码块按预期逐行打印:

但是这个没有任何作用(它甚至没有退出):

唯一的区别是使用 ofGZIPInputStream而不是ZipInputStream。两个类都实现了InputStream

我错过了什么吗?或者有什么解决办法吗?

0 投票
1 回答
64 浏览

scala - Scala Stream prepend 返回 List 而不是 Stream

我有一个 Seq,x和一个 Stream,y并且我希望预先x获得y一个新的 Stream。但是,静态类型y导致 Stream 立即被评估,我很困惑为什么会这样。这是一个例子:

由于该++:方法是在 Stream 实例上调用的,因此我希望得到一个 Stream,但结果却是一个 List。有人可以解释为什么会这样吗?