scala - 按类型过滤 Scala 列表

标签 scala

我有一个这样的类结构

abstract class A
class B extends A
class C extends A
class D extends A
class E extends A

我有各种实例的集合,例如:

val xs = List(new D, new B, new E, new E, new C, new B)

我的问题是,有没有一种优雅的方法可以从列表中过滤掉一些子类?

假设我想要除 B 和 C 之外的所有实例。我可以用一堆 isInstanceOf 来做到这一点,或者使用像这样的收集:

val ys = (xs collect {
    case b: B => None
    case c: C => None
    case notBorC => notBorC
}).filter(_ != None).asInstanceOf[List[A]]

这可行,但感觉很尴尬,主要是因为滤镜和 Actor 阵容。有更优雅的方式吗?代码越少越好,我希望有一个在添加更多 A 子类时不需要更新的解决方案。

最佳答案

collect 可用于过滤定义函数的值:

获取类型A的所有值:

xs.collect { case a: A => a }

获取除 B 和 C 之外的所有值:

xs diff xs.collect { case x@(_: B | _: C) => x }

关于scala - 按类型过滤 Scala 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381797/

相关文章:

scala - 1.+(2) 在 scala 中给出了正确的答案。如何?

arrays - 尝试在 Scala 中声明特定大小的数组

scala - Scala的Lift如何管理状态?

javascript - 从玩!到 Scalatra,模板化问题,目录结构

java - 如何使用 Ensime 扩展在 Visual Studio Code 上获取 Scala?

android - gradle-android-scala-plugin 给出 "Could not find matching constructor"错误

Scala 中的 Java 风格 LinkedList

scala - 达到 float 的队列时该怎么办?

scala - 使用项目中的类的 sbt 自定义任务

scala - 如何获取刚刚由 ScalaQuery 插入的自增 ID