我是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
答案 0 :(得分:2)
productIterator
在scala.Product
上定义,所有案例类都扩展,所以你可以写
def extract(e: Product): Array[Any] = ...
您可以在所有Product
上调用此方法,而不仅仅是您的模型,这可能是也可能不是问题。如果您想避免这种情况,只需在最后一个代码段BaseModel
中Product
:
abstract class BaseModel() extends Product
如果您不熟悉这个术语,请查找抽象类。