Вы можете использовать неявный класс вместе с неявной CanBuildFrom
. Это действительно использует изменяемый строитель, но не на стороне вызывающего абонента:
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()
}
}
}
, который будет использоваться как это:
import MyResultSetContainer._
val rs = stmnt.executeQuery("select * from pg_user")
val names = for (row <- rs) yield (row.getString(1))
println(names)
rs.close()
для понимания использует map
под капотом, так что если вы предпочитаете map
напрямую:
val names = rs.map(row => row.getString(1))
, который производит последовательность. Благодаря CanBuildFrom
вы можете производить другие коллекции, а также путем предоставления типа в явном виде:
val names: List[String] = rs.map(row => row.getString(1))
CanBuildFrom
Как работает? Компилятор Scala рассматривает типы, участвующие в этом выражении: существует результирующий тип и тип, возвращаемый функцией, называемой map. Основываясь на этой информации, компилятор Scala предоставляет фабрику неявно, которая может быть использована для создания подходящего строителя. Поэтому вам нужен только один метод для создания различных типов коллекций.
Если вы хотите вернуть несколько значений, просто возвращает кортеж:
val columns = rs.map(row => (row.getInt(2), row.getString(1)))
и кортеж может быть использован для создания Map
непосредственно:
val keyNamesMap: Map[Int, String] =
rs.map(row => (row.getInt(2), row.getString(1)))
Это основано на идее о том, что набор результатов представляет собой список строк, и поэтому функция map
должна быть доступна поверх нее. Неявный класс используется для добавления метода map
в базовый набор результатов неявно.
Фактически в идиоматической scala это будет выглядеть как: val rs = stmt.executeQuery(); val result = for (r <- rs) yield r.getInt (1) '(просто псевдокод, если хотите) –
Вы можете посмотреть это сообщение: http://stackoverflow.com/questions/2102662/scala-exposing-a-jdbc-resultset-a-generator-iterable/15950556 # 15950556 –
Если вы ищете LINQ-подобные запросы в scala, посмотрите [Slick] (http: // slick. typesafe.com/) –