首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过迭代生成惰性scala流

通过迭代生成惰性scala流
EN

Stack Overflow用户
提问于 2015-11-27 08:31:22
回答 2查看 184关注 0票数 0

我正在寻找一种方法来生成这种形式的scala流(相当于F#的序列):

代码语言:javascript
运行
复制
let allRows resultSet : seq<Row> =
  seq {
    while resultSet.next() do
      yield new Row(resultSet)
  }

在scala中有什么方法可以轻松做到这一点吗?我发现涉及(非尾递归)递归的唯一方式是,对于resultSet中的大量行,这将意味着一定的堆栈溢出。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-11-27 12:47:28

您可以像这样实现它:

代码语言:javascript
运行
复制
 def toStream(rs:ResultSet):Stream[Row] =
   if(!rs.next) Stream.Empty
   else new Row(rs) #:: toStream(rs)

请注意,由于toStream是使用def定义的(与val定义相反),因此此解决方案不会将整个流保留在内存中,流的头部将被垃圾收集。

您可以使用的另一个选项是定义新的迭代器:

代码语言:javascript
运行
复制
def toIterator(rs:ResultSet) = new Iterator[Row] {
  override def hasNext: Boolean = rs.next()
  override def next(): Row = new Row(rs)
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-27 14:53:08

假设你有这样的东西

代码语言:javascript
运行
复制
trait ResultSet {
  def next: Boolean
}

class Row(rs: ResultSet)

您可以将您的函数定义为

代码语言:javascript
运行
复制
def allRows(rs: ResultSet): Stream[Row] =
  Stream.continually(if (rs.next) Some(new Row(rs)) else None)
    .takeWhile(_.isDefined).map(_.get)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33948795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档