2017-09-04 53 views
0

我是Scala的新手,并且曾经在类似的问题中看过,但我不确定它们与我的问题是否一样 - 如果我错了,请致歉。Scala将数值提取到多个案例类的数组中

从本质上讲,我不确定如何重构这段代码

case class ModelX(a: Int, b: Int) 

case class ModelY(b: Int, c: Int) 

case class ModelZ(a: Int, c: Int) 


def extract_x(e: ModelX): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 


def extract_y(e: ModelY): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 


def extract_z(e: ModelZ): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 

为任意数量的模型(如我有超过3个)。我这样做的原因是我可以从Cassandra中提取一行到这些模型中的一个,然后我需要将它传递给Array[Any],因为在此之后我有序列化方法可用,并且可以使用返回的值我的选择语言更舒适。

我试图定义一个基类,ModelX|Y|Z扩展,这样我可以只在基类应用extract,但productIterator是不可用的基类。如果这是一个不好解释,我试过/想做的事是这样的:

class BaseModel() 

case class ModelX(a: Int, b: Int) extends BaseModel 

case class ModelY(b: Int, c: Int) extends BaseModel 

case class ModelZ(a: Int, c: Int) extends BaseModel 


def extract(e: BaseModel): Array[Any] = e.productIterator.map { 

    case op: Option[_] => op.getOrElse(null) 
    case v => v 

}.toArray 

我很新的斯卡拉,所以我想我已经错过了一些东西明显。任何帮助在这里将不胜感激。

AKHIL

回答

2

productIterator定义上scala.Product,所有情况下的类扩展,所以你可以只写

def extract(e: Product): Array[Any] = ... 

这可能是也可能不是,你可以调用这个方法对所有Product问题不仅仅是你的模型。如果你想避免这种情况,只是让BaseModel在你的上段延伸Product

abstract class BaseModel() extends Product 

查找抽象类如果你不熟悉这个词。

+0

谢谢!第一个建议很完美。 –