3

我知道打字在 Scala 中很重要,理想情况下你可以通过使用模式匹配之类的东西来绕过类型转换或任何混乱的解决方案。但是,如果我正在遍历作为常见超类型的子类型的项目列表或项目序列,并且只想要该子类型的序列中特定子类型的项目,我无法理解我该怎么做。我不认为我可以在 a 中放置模式匹配for-comprehension来实现这一点。

因此,例如,我有这些课程:

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

我有 aSeq[SuperType]并且我想获得 aSeqSubtypeA实例,所以 a Seq[SubTypeA],这样我就可以遍历它并执行SubTypeA为所有元素提供的方法。

4

1 回答 1

6

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

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

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

于 2013-11-15T15:26:30.457 回答