我有一些类型安全的案例类,我想把它变成一个向量:
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
类型转换不适用于我们的值类。是否有一种惯用/有效的方法来转换为向量?
答案 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