我知道键入在Scala中很重要,理想情况下,您可以使用模式匹配之类来解决类型转换或任何混乱的解决方案。但是,如果我要遍历作为普通超类型的子类型的列表或项目序列,而只想要该子类型的序列中的特定子类型的对象,我将不知道如何处理。我认为我不能在for-comprehension中放入模式匹配来实现此目的。

例如,让我说这些类:

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

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

最佳答案

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

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

关于scala - 避免对一系列混合项进行全面理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20004359/

10-09 06:48