У меня есть ряд рядов в базе данных, и я хотел бы обеспечить интерфейс, чтобы вращаться через них как это:
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
}
Есть ли способ, которым я мог преобразовать это, чтобы не сохранить весь набор в памяти? Возможно, я мог использовать для понимания?
Попробуйте расширить итератор вместо этого. Я не проверил его, но что-то вроде этого:
def findAll: Iterator[MyObject] = new Iterator[MyObject] {
val rs = getRs
override def hasNext = rs.hasNext
override def next = new valueFromResultSet(rs.next)
}
Это должно хранить RS, когда он вызывается, и в противном случае просто будет легкая обертка для звонков в RS.
Если вы хотите сохранить значения, которые вы пройдете, проверьте поток.