避免类型转换以便理解一系列混合项目

时间:2013-11-15 15:20:18

标签: scala filter for-comprehension

我知道在Scala中输入是一个大问题,理想情况下,你可以通过使用模式匹配等方式来进行类型转换或任何混乱的解决方案。但是,如果我在一个列表或一系列项目中迭代这些公共超类型的子类型,并且只想在该子类型的序列中使用特定子类型的那些项目,我无法理解如何去做。我不认为我可以在for-comprehension中设置模式匹配来实现此目的。

因此,举个例子,我有这些类:

sealed abstract class SuperType
case class SubtypeA extends SuperType
case class SubtypeB extends SuperType

我有一个Seq[SuperType],我希望得到SeqSubtypeA个实例,所以Seq[SubTypeA],这样我就可以遍历它并执行SubTypeA为所有元素提供的方法。

1 个答案:

答案 0 :(得分:6)

Scala有function called collect,可以完全满足您的需求。它将Partial Function作为参数,如果在元素上定义了Partial Function,则它将应用它。如果不是那么它会跳过它。由于匹配本质上是一个部分函数,​​我们可以利用它来获得优势:

val list: Seq[SuperType] = ???
val listOfAtypes = list.collect({ case a: SubtypeA => a })

{ case a: SubtypeA => a }是PartialFunction [SuperType,SubtypeA]。