2016-07-07 17 views
0

で製品を解く:Scalaは継承してケースクラスのコレクションをtraveseし、次を考えると、シリアライズ

sealed trait ProdItem { 
    val name: String; 
    val price: BigDecimal; 
} 

final case class Foo(override val name: String = "Apple", 
    override val price: BigDecimal = 0.50) extends ProdItem 

final case class Bar(override val name: String = "Orange", 
    override val price: BigDecimal = 0.35) extends ProdItem 

val products = List(Foo, Bar, Foo, Bar) 

// products: List[scala.runtime.AbstractFunction2[String,scala.math.BigDecimal,Product with Serializable with ProdItem]] = List(Foo, Bar, Foo, Bar) 

私は、リストのコレクションは、その後の製品とシリアル化と混合され見ることができます。だから単純なリスト[ProdItem]ではありません。どのようにして製品の要素を簡単にトラバースするだけですか?

val fullPrice = product.map(x => some_conversion_function(x).price).sum 

つまり、タプルをリーフケースクラスに戻すにはどうすればよいでしょうか?

ケースクラスの継承が愚かな別の例ですか?

+2

あなたが望むもののリストはありません。あなたは関数リスト 'List(Foo.apply、Bar.apply、Foo.apply、Bar.apply)'を持っています。代わりに 'val products = List(Foo()、Bar()、Foo()、Bar())'を試してください。 –

+0

私が掲示した後、私は括弧とコンストラクタで愚かな間違いを実現しました。私は実際にScalaのタプル関数のリストです。とにかく、私の質問に答えてくれてありがとう。 –

答えて

3

これは機能します。

val products = List(new Foo, new Bar, new Foo, new Bar) 
val fullPrice = products.map(_.price).sum // 1.70 

以下を考慮する。この例では

val foo = Foo() 

Fooには名前や価格を持っていませんが、fooありません。

ケースクラスをインスタンス化するときは、new Foo、または「ファクトリメソッド」Foo()のオプションがあります。 jwvhの答えに拡大

+0

あなたはこれを示していますが、 'val products = List(Foo()、Bar()、Foo()、Bar())'も働いていると言っています。 –

1

List(Foo, Bar, Foo, Bar)

Fooは、クラスFooのコンパニオンオブジェクト、このクラスのインスタンスでありません。ケースクラスの

  1. コンパニオンオブジェクトはNは、コンストラクタの引数の数であるAbstractFunctionNを拡張するのであなたのproductsは(ないProduct with Serializable with ProdItemの!)関数の集まりです。

  2. FooBarの場合、引数のタイプとタイプは同じです(引数のタイプが異なると、数字が異なる場合はより複雑なタイプになります。おそらくSerializableまたはAnyRefとなります)。

  3. Product with Serializable with ProdItemは、関数の結果の一般的なスーパータイプです。です。

関連する問題