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
如果您不熟悉这个术语,请查看摘要 类。
我是 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
如果您不熟悉这个术语,请查看摘要 类。