Mam zestaw wierszy w bazie danych, i chciałbym, aby zapewnić interfejs do spin przez nich tak:Scala: Odsłanianie JDBC ResultSet przez generator (iterable)
def findAll: Iterable[MyObject]
Tam, gdzie nie potrzebujemy mieć wszystkich instancji w pamięci naraz. W języku C# można łatwo tworzyć generatory takie jak to przy użyciu yield, kompilator dba o konwersję kodu, który przechodzi przez zestaw rekordów do iteratora (rodzaj odwracania go).
Mój bieżący kod wygląda następująco:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
Czy istnieje sposób mogę przekonwertować to do nie zapisać cały zestaw w pamięci? Może mógłbym użyć do zrozumienia?
Dam ci ten strzał, thx Rex –
Po prostu założyłem, że rs rzeczywiście ma metodę "hasNext". Jeśli nie, powinieneś buforować następny wynik za pomocą (prawdopodobnie prywatnego) var wewnątrz iteratora i mieć wartośćNa przykład powiedzieć, czy ten buforowany wynik istnieje. –
Tak, to działa, użyłem hasNext = rs.isLast. Problem polega na tym, że nie mam żadnego mechanizmu zamknięcia rs i połączenia. W moim obecnym kodzie zawinąłem (powyższy) kod w "użyciu" metody, która zamyka dla mnie rzeczy. –