można użyć niejawny klasę wraz z domniemanym CanBuildFrom
. To nie używać zmienny budowniczy, ale nie po stronie rozmówcy:
object MyResultSetContainer {
implicit class MyResultSet(rs: ResultSet) {
def map[T, C <: Iterable[T]](f: (ResultSet) => T)
(implicit cbf: CanBuildFrom[Nothing, T, C]): C = {
val builder = cbf()
while (rs.next()) {
builder += f(rs)
}
builder.result()
}
}
}
być używane tak:
import MyResultSetContainer._
val rs = stmnt.executeQuery("select * from pg_user")
val names = for (row <- rs) yield (row.getString(1))
println(names)
rs.close()
dla zrozumienia używa map
pod maską, więc jeśli wolisz map
bezpośrednio:
val names = rs.map(row => row.getString(1))
, który tworzy sekwencję. Dzięki CanBuildFrom
można produkować inne kolekcje, jak również poprzez dostarczenie typ wyraźnie:
val names: List[String] = rs.map(row => row.getString(1))
Jak CanBuildFrom
pracę? Kompilator Scala analizuje typy związane z tym wyrażeniem: Istnieje wynikowy typ i typ zwracany przez funkcję wywoływaną przez mapę. Na podstawie tych informacji kompilator Scala dostarcza domyślnie fabrykę, której można użyć do utworzenia odpowiedniego konstruktora. Potrzebujesz więc tylko jednej metody do produkcji różnych rodzajów kolekcji.
Jeśli chcesz zwracać wiele wartości, po prostu wrócić krotki:
val columns = rs.map(row => (row.getInt(2), row.getString(1)))
i krotka mogą być wykorzystane do stworzenia Map
bezpośrednio:
val keyNamesMap: Map[Int, String] =
rs.map(row => (row.getInt(2), row.getString(1)))
ta opiera się na założeniu, że zestaw wyników jest listą wierszy, więc funkcja map
powinna być dostępna na wierzchu. Niejawna klasa służy do niejawnego dodania metody map
do podstawowego zestawu wyników.
Właściwie w idiomatycznej scali wyglądałoby to tak: 'val rs = stmt.executeQuery(); val result = for (r <- rs) yield r.getInt (1) '(tylko pseudokod, jeśli zechcesz) –
Możesz rzucić okiem na ten post: http://stackoverflow.com/questions/2102662/scala-ekspozycja-a-jdbc-resultset-through-a-generator-iterable/15950556 # 15950556 –
jeśli szukasz zapytań podobnych do LINQ w scala, spójrz na [Slick] (http: // slick. typesafe.com/) –