J'ai un ensemble de lignes dans une base de données, et je voudrais fournir une interface pour filer à travers eux comme ceci:Scala: L'exposition d'un ResultSet JDBC par un générateur (itérables)
def findAll: Iterable[MyObject]
Où nous n'avons pas besoin d'avoir toutes les instances en mémoire à la fois. En C#, vous pouvez facilement créer des générateurs de ce type en utilisant yield, le compilateur s'occupe de convertir du code qui traverse le jeu d'enregistrements en un itérateur (sorte de l'inverser).
Mon code actuel ressemble à ceci:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
Est-il possible que je pourrais convertir ce pour ne pas stocker l'ensemble dans la mémoire? Peut-être que je pourrais utiliser un pour la compréhension?
Je vais donner un coup de feu, thx Rex –
J'ai juste supposé que rs avait en fait une méthode "hasNext". Sinon, vous devriez mettre en cache le résultat suivant avec un var (probablement privé) à l'intérieur de l'itérateur et avoir hasNext dire si ce résultat en cache existe. –
Ouais, cela fonctionne, j'ai utilisé hasNext = rs.isLast. Un problème est que je n'ai aucun mécanisme pour fermer le RS et la connexion. Dans mon code actuel, j'ai enveloppé le code (ci-dessus) dans une méthode "using" qui ferme les choses pour moi. –