У меня есть набор строк в базе данных, и я хотел бы предоставить интерфейс для раскрутки через них, как это:Scala: Разоблачение JDBC ResultSet через генератор (итерация)
def findAll: Iterable[MyObject]
Там, где мы не требуем одновременного использования всех экземпляров в памяти. В C# вы можете легко создавать генераторы, подобные этому с использованием yield, компилятор позаботится о преобразовании кода, который перебирает набор записей в итератор (вроде его инвертирования).
Мой текущий код выглядит следующим образом:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
Есть ли способ, которым я мог бы преобразовать это не хранить весь набор в памяти? Возможно, я мог бы использовать для понимания?
Я дам этот снимок, thx Rex –
Я просто предположил, что rs на самом деле имеет метод hasNext. Если нет, вы должны кэшировать следующий результат с помощью (вероятно, частного) var внутри итератора и иметь hasNext, чтобы сказать, существует ли этот кешированный результат. –
Да, это работает, я использовал hasNext = rs.isLast. Одна проблема заключается в том, что у меня нет механизма для закрытия rs и соединения. В моем текущем коде я завернул (выше) код в методе «использования», который закрывает для меня вещи. –