Scala将值提取到多个案例类的数组中

时间:2017-09-04 10:44:44

标签: scala inheritance case-class

我是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

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

AKHIL

1 个答案:

答案 0 :(得分:2)

productIteratorscala.Product上定义,所有案例类都扩展,所以你可以写

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

您可以在所有Product上调用此方法,而不仅仅是您的模型,这可能是也可能不是问题。如果您想避免这种情况,只需在最后一个代码段BaseModelProduct

abstract class BaseModel() extends Product

如果您不熟悉这个术语,请查找抽象类。