Скала: Демонстрация JDBC ResultSet через (повторяемый) генератор

У меня есть ряд рядов в базе данных, и я хотел бы обеспечить интерфейс, чтобы вращаться через них как это:

def findAll: Iterable[MyObject]

Где мы не требуем наличия всех случаев в памяти сразу. В C# Вы можете легко создать генераторы как этот урожай использования, компилятор заботится о преобразовании кодекса что петли через recordset в iterator (вид инвертирования его).

Мой текущий кодекс похож на это:

def findAll: List[MyObject] = {
  val rs = getRs
  val values = new ListBuffer[MyObject]
  while ( rs.next() ) 
    values += new valueFromResultSet(rs)
  values.toList
}

Есть ли способ, которым я мог преобразовать это, чтобы не сохранить весь набор в памяти? Возможно, я мог использовать для понимания?

14
задан Alex Black 20 January 2010 в 15:47
поделиться

1 ответ

Попробуйте расширить итератор вместо этого. Я не проверил его, но что-то вроде этого:

def findAll: Iterator[MyObject] = new Iterator[MyObject] {
  val rs = getRs
  override def hasNext = rs.hasNext
  override def next = new valueFromResultSet(rs.next)
}

Это должно хранить RS, когда он вызывается, и в противном случае просто будет легкая обертка для звонков в RS.

Если вы хотите сохранить значения, которые вы пройдете, проверьте поток.

14
ответ дан 1 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: