tengo un conjunto de filas de una base de datos, y me gustaría proporcionar una interfaz para girar a través de ellos como esto:Scala: La exposición de un conjunto de resultados JDBC a través de un generador (iterable)
def findAll: Iterable[MyObject]
Donde no requerimos tener todas las instancias en la memoria a la vez. En C# puede crear fácilmente generadores como este usando yield, el compilador se encarga de convertir el código que recorre el conjunto de registros en un iterador (como invertirlo).
Mi código actual es el siguiente:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
¿Hay alguna manera de que pudiera convertir esto a no almacenar todo el conjunto en la memoria? Tal vez podría utilizar un para la comprensión?
Voy a dar una oportunidad, thx Rex –
Acabo de suponer que rs en realidad tiene un método "hasNext". Si no es así, debe almacenar en caché el siguiente resultado con una var (probablemente privada) dentro del iterador y hacer que hasNeNe decir si ese resultado en caché existe. –
Sí, eso funciona, utilicé hasNext = rs.isLast. Un problema es que no tengo ningún mecanismo para cerrar el rs y la conexión. En mi código actual he envuelto el código (arriba) en un método de "uso" que me cierra las cosas. –