Tôi đã có một tập hợp các hàng trong một cơ sở dữ liệu, và tôi muốn cung cấp một giao diện để quay qua chúng như thế này:Scala: Phơi bày một JDBC ResultSet thông qua một máy phát điện (iterable)
def findAll: Iterable[MyObject]
Nơi chúng tôi không yêu cầu phải có tất cả các cá thể trong bộ nhớ cùng một lúc. Trong C# bạn có thể dễ dàng tạo ra các máy phát điện như thế này bằng cách sử dụng năng suất, trình biên dịch sẽ chăm sóc chuyển đổi mã lặp qua recordset thành một trình lặp (loại đảo ngược nó).
mã hiện tại của tôi trông như thế này:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while (rs.next())
values += new valueFromResultSet(rs)
values.toList
}
Có cách nào tôi có thể chuyển đổi này để không lưu trữ toàn bộ tập trong bộ nhớ? Có lẽ tôi có thể sử dụng để hiểu?
Tôi sẽ cung cấp cho rằng một shot, thx Rex –
Tôi chỉ giả định rằng rs thực sự có một phương pháp "hasNext". Nếu không, bạn nên cache kết quả kế tiếp với một var (có thể là private) bên trong iterator và có hasNext nói liệu kết quả đã lưu trữ có tồn tại hay không. –
Vâng, nó hoạt động, tôi đã sử dụng hasNext = rs.isLast. Một vấn đề là mặc dù tôi không có bất kỳ cơ chế nào để đóng rs và kết nối. Trong mã hiện tại của tôi, tôi đã bao bọc (ở trên) mã trong một phương pháp "sử dụng" mà đóng cửa mọi thứ cho tôi. –