2016-07-07 19 views
0

斯卡拉travese 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) 

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

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

换句话说,如何将Tuple变回叶案例类直接?

这是另一个例子,其中的情况下类的继承是傻瓜?

+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()

+0

你表明这一点,但不要直接说出来:说'VAL产品=名单(富(),酒吧(),富(),酒吧())'也适用。 –

1

扩展在jwvh的回答是:

List(Foo, Bar, Foo, Bar)Foo是类Foo的同伴对象,而不是这个类的一个实例。你products是函数的集合(不Product with Serializable with ProdItem!),因为case类

  1. 伴侣对象扩展AbstractFunctionN,其中N是构造函数参数的个数。

  2. 对于FooBar,数量和类型的参数正好是相同的(如果类型的参数是不同的,你会最终有一个更复杂的类型,如果数字是不同的,你会可能最终与SerializableAnyRef)。

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