我正在寻找一种方法来生成这种形式的scala流(相当于F#的序列):
let allRows resultSet : seq<Row> =
  seq {
    while resultSet.next() do
      yield new Row(resultSet)
  }在scala中有什么方法可以轻松做到这一点吗?我发现涉及(非尾递归)递归的唯一方式是,对于resultSet中的大量行,这将意味着一定的堆栈溢出。
谢谢
发布于 2015-11-27 12:47:28
您可以像这样实现它:
 def toStream(rs:ResultSet):Stream[Row] =
   if(!rs.next) Stream.Empty
   else new Row(rs) #:: toStream(rs)请注意,由于toStream是使用def定义的(与val定义相反),因此此解决方案不会将整个流保留在内存中,流的头部将被垃圾收集。
您可以使用的另一个选项是定义新的迭代器:
def toIterator(rs:ResultSet) = new Iterator[Row] {
  override def hasNext: Boolean = rs.next()
  override def next(): Row = new Row(rs)
}发布于 2015-11-27 14:53:08
假设你有这样的东西
trait ResultSet {
  def next: Boolean
}
class Row(rs: ResultSet)您可以将您的函数定义为
def allRows(rs: ResultSet): Stream[Row] =
  Stream.continually(if (rs.next) Some(new Row(rs)) else None)
    .takeWhile(_.isDefined).map(_.get)https://stackoverflow.com/questions/33948795
复制相似问题