Scala:将嵌套值类转换为Vector

时间:2015-02-17 23:42:49

标签: scala

我有一些类型安全的案例类,我想把它变成一个向量:

case class Bdrms(underlying: Double) extends AnyVal
object Bdrms {
    implicit def toBdrm(x: Double): Bdrms = Bdrms(x)
}
case class Bath(underlying: Double) extends AnyVal
object Bath {
    implicit def toBath(x: Double): Bath = Bath(x)
}
// same pattern for many (20-30) other variables. sq ft, price, etc.
// and a parent case class

case class RealEstateDataPoint(bdrm: Bdrm, bath: Bath, sqft: Sqft,//)

一项服务需要以Doubles的形式使用这些Vector。如果没有使用价值类别,即如果我们只是     case class RealEstateDatePoint(bdrm: Double, bath: Double...) 然后像下面这样的东西迭代字段来创建一个向量:

def toVector(dataCC: RealEstateDataPoint): Vector[Double] = {
    val m = dataCC.productArity
    val vector = Vector(m)
    for (i<-0 until m) {
        vector(i) = dataCC.productElement(i).asInstanceOf[Double]
    }
    vector
}

但是,当然,asInstanceOf类型转换不适用于我们的值类。是否有一种惯用/有效的方法来转换为向量?

1 个答案:

答案 0 :(得分:4)

您可以使用结构类型:

dataCC.productIterator.map {
    case h:{ val underlying: Double } => h.underlying 
}.toVector

您也可以考虑让所有案例类继承一些特征:

trait HasUnderlying { val underlying: Double }
case class Bdrms(val underlying: Double) extends HasUnderlying

然后你可以得到所需的矢量:

dataCC.productIterator.map { 
    case h: HasUnderlying => h.underlying 
}.toVector