Ich habe eine Reihe von Zeilen in einer Datenbank erhalten, und ich möchte eine Schnittstelle schaffen, durch sie so spinnen:Scala: Belichten eines JDBC ResultSet durch einen Generator (abzählbaren)
def findAll: Iterable[MyObject]
Wo wir nicht alle Instanzen gleichzeitig im Speicher haben müssen. In C# können Sie einfach Generatoren wie diesen mit yield erzeugen, der Compiler kümmert sich darum, Code, der das Recordset durchläuft, in einen Iterator umzuwandeln (eine Art, ihn zu invertieren).
Meine aktuellen Code sieht wie folgt aus:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
Gibt es eine Weise, die ich diese konvertieren konnte nicht im Speicher den gesamten Satz speichern? Vielleicht könnte ich ein für das Verständnis verwenden?
Ich gebe das eine Chance, thx Rex –
Ich habe nur angenommen, dass rs tatsächlich eine "hasNext" -Methode hat. Wenn nicht, sollten Sie das nächste Ergebnis mit einer (wahrscheinlich privaten) Variablen im Iterator zwischenspeichern und HasNext sagen, ob das Ergebnis im Cache existiert. –
Ja, das funktioniert, ich habe hasNext = rs.isLast verwendet. Ein Problem ist, obwohl ich keinen Mechanismus habe, um die RS und die Verbindung zu schließen. In meinem aktuellen Code habe ich den (oben genannten) Code in eine "using" -Methode verpackt, die Dinge für mich schließt. –