2013-11-15 18 views
3

我知道在Scala中键入是一件大事,理想情况下,您可以使用类似于模式匹配的东西来绕过类型转换或任何混乱的解决方案。然而,我无法理解,如果我遍历一个列表或一系列常用超类型的子类型的项目,并且只想在该子类型的一个序列中指定一个特定子类型的项目,我该怎么做。我不认为我可以在for-comprehension中进行模式匹配来实现此目的。避免在一系列混合项目中进行类型转换

因此,可以说,比如我有这些类:

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

我有一个Seq[SuperType],我想只是SubtypeA实例的Seq,所以Seq[SubTypeA],让那么我可以遍历它并为所有元素执行由SubTypeA提供的方法。

回答

6

斯卡拉有一个function called collect正是你所需要的。它将部分函数作为参数,如果元素中定义了部分函数,​​那么它将应用它。如果不是,那么它跳过它。由于匹配本质上是一个部分功能,我们可以用它来我们的优势:

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

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

+0

谢谢,工作就像一个魅力!我仍然是Scala的初学者,所以仍然需要习惯所有这些黑暗的秘密:) – jbx

+0

请注意'({...})'语法是多余的,您只需要大括号:'list.collect {case a:SubtypeA => a}' – dhg

+0

@dhg是的,你是对的。我只是想强调'{case ...}'将成为'PartialFunction',需要传递给'collect'。 –