당신은 암시 적 CanBuildFrom
과 함께 암시 클래스를 사용할 수 있습니다. 당신이 map
을 직접 선호하는, 그래서 만약
는 이해에 대한
import MyResultSetContainer._
val rs = stmnt.executeQuery("select * from pg_user")
val names = for (row <- rs) yield (row.getString(1))
println(names)
rs.close()
(가) 후드 map
을 사용
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()
}
}
}
은 다음과 같이 사용하는이 호출자의 측면에서 변경 가능한 빌더를 사용하지 아니지만 :
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
메서드를 추가하는 데 사용됩니다.
실제로 관용적 인 스칼라에서는 'val rs = stmt.executeQuery(); val result = for (r-rs) yield r.getInt (1)'(단지 의사 코드라면) –
이 게시물을보실 수 있습니다 : http://stackoverflow.com/questions/2102662/scala-exposing-a-jdbc-resultset-through-a-generator-iterable/15950556 # 15950556 –
스칼라에서 LINQ와 유사한 쿼리를 찾으려면 [Slick] (http : // slick. typesafe.com/) –