通过迭代生成惰性scala流

时间:2015-11-27 00:31:22

标签: scala f# functional-programming

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

let allRows resultSet : seq<Row> =
  seq {
    while resultSet.next() do
      yield new Row(resultSet)
  }

有没有办法轻松地在scala中执行此操作?我发现涉及(非tailrecursive)递归的唯一方法,对于resultSet中的大量行,这意味着某些堆栈溢出。

由于

2 个答案:

答案 0 :(得分:1)

您可以像这样实现:

 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)
}

答案 1 :(得分:1)

假设您有类似

的内容
var connection = $.hubConnection("http://192.168.9.6:3030/signalr");
var setupHubProxy = connection.createHubProxy('SetupHub');

setupHubProxy.on('addMessage', function (msg) {
    alert(msg);
});

connection.start()
        .done(function () {
            console.log('connected');
        })
    .fail(function (a) {
        console.log('not connected' + a);
    });

您可以将您的功能定义为

trait ResultSet {
  def next: Boolean
}

class Row(rs: ResultSet)
相关问题