2017-10-04 4 views
1

多くの列を持ち、すべての行をオブジェクトに変換するCSVファイルを読んでいます。それは次のようになります:多くの引数を持つコンストラクタを呼び出すエレガントな方法はありますか?

val sighting = Sighting(
    cols(0).toInt, 
    cols(1), 
    cols(2), 
    cols(3), 
    cols(4), 
    cols(5).toInt, 
    cols(6), 
    cols(7), 
    cols(8), 
    cols(9).toDouble 
    cols(10), 
    cols(11), 
    cols(12)) 

これは私に深刻に見えます。名前付きパラメータが不足している(これは改善されたものです)、あまり見栄えが悪く見えるようにするためにできることはありますか?これはどのように

+1

たぶん[不定形](https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapelessに見えます/examples/csv.scala)。 – HTNW

+3

補助的なコンストラクタを、それが唯一の引数として 'Seq [String]'をとる 'Sighting'に追加することができます(そのファイルは単なる例に過ぎません)。そのコンストラクタ内の醜さを隠します。つまり、 'Seq'が展開され、' toInt'が追加され、一次コンストラクタが呼び出されます。 – jwvh

答えて

2

val sighting = cols match { case Seq(c0, c1, c2, ..., c12) => 
    Sighting(c0.toInt, c1, c2, ...) 
} 
+1

ほんの少しだけ良いようです – Ruby

0

あなたはArray受け取るコンストラクタに醜さを転送することができます。私はこれが醜さのレベルを下げるわけではないことを認識していますが、それでも対処するのがより良い場所です。

object Sightings{ 

    def apply(array: Array[String]): Sightings = new Sightings(array(0), array(1), ...) 

} 

次にあなたが使用することができます。

val strings: Array[String] = line.split(",") //split the line and convert it into array of strings 
val sightings: Sightings = Sightings(strings) //create Sighting from the array 
関連する問題