Scala遍历带有继承的案例类集合,并使用可序列化解决产品

时间:2016-07-07 18:13:35

标签: scala class inheritance tuples case

鉴于以下内容:

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)

我可以看到列表集合与Products混合,然后是Serializable。所以它不是一个简单的List [ProdItem]。你如何简单地遍历产品中的元素?

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

换句话说,如何将元组简单地转回叶子类?

这是案例类继承是愚蠢的另一个例子吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

扩展jwvh的回答:

Foo中的

List( Foo, Bar, Foo, Bar)是类Foo的伴随对象,而不是此类的实例。您的products是函数的集合(不是Product with Serializable with ProdItem!),因为

  1. 案例类的伴随对象扩展AbstractFunctionN,其中N是构造函数参数的数量。

  2. 对于FooBar,参数的数量和类型恰好相同(如果参数类型不同,您最终会得到更复杂的类型,如果数字不同,您最终可能只会使用SerializableAnyRef)。

  3. Product with Serializable with ProdItem结果函数的常见超类型。