2017-09-04 9 views
0

私はScalaを初めて使い慣れたので、同様の質問で見ていますが、間違っていると私の質問と同じであるとは確信していません。複数のケースクラスの配列にScalaの値を抽出します

は基本的に、私は(私が3以上のものを持っている持っているように)モデルの任意の数のこのコード

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 

をリファクタリングする方法がわからないと思います。私がこれをやっている理由は、カッサンドラからこれらのモデルの1つに行を抽出することができることです。この点を覚えていれば、逐次化の方法があるのでArray[Any]に渡す必要があります。私の選択した言語でもっと楽に。

基本クラスにextractを適用することができるように、ModelX|Y|Zが拡張する基本クラスを定義しようとしましたが、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 

私はスカラ座に非常に新しいので、私は私が何かを明らかに見逃していると想像。ここのお手伝いをいただければ幸いです。あなたはちょうどそれがまたはあなたがすべてのProductでこのメソッドを呼び出すことができる問題であってもなくてもよい

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

を書くことができるように

アクヒル

答えて

2

productIteratorは、すべてのケースクラスを拡張scala.Product、上で定義されていますあなたのモデルだけではありません。あなたはこれを避けたい場合は、単にあなたの最後のスニペットでBaseModelProductを拡張します

abstract class BaseModel() extends Product 

は、この用語に精通していない場合には抽象クラスを検索します。

+0

ありがとうございます!最初の提案は完全に機能しました。 –

関連する問題