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

Scala extract values into array for multiple case classes

我是 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 扩展的基础 class,这样我就可以在基础 class 上应用 extract,但是 productIterator基地 class 不可用。如果那是一个错误的解释,我 tried/wanted 要做的是:

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 的新手,所以我想我错过了一些明显的东西。如有任何帮助,我们将不胜感激。

阿基尔

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

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

您可以在所有 Product 上调用此方法,而不仅仅是您的模型,这可能是问题,也可能不是问题。如果你想避免这种情况,只需在你的最后一个片段中制作 BaseModel extend Product:

abstract class BaseModel() extends Product

如果您不熟悉这个术语,请查看摘要 类。