按类型筛选Scala列表
发布时间:2020-12-16 09:39:02 所属栏目:安全 来源:网络整理
导读:我有一个类结构 abstract class Aclass B extends Aclass C extends Aclass D extends Aclass E extends A 我有各种实例的集合,例如: val xs = List(new D,new B,new E,new C,new B) 我的问题是,有没有一个优雅的方法来从列表中过滤一些子类? 假设我想要
我有一个类结构
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 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]] 这个工作,但感觉很尴尬,主要是因为过滤器和铸造。有更优雅的方式吗?较少的代码是首选的,如果我添加了更多的子类,我想要一个不需要更新的解决方案。 解决方法
flatMap那个屎! (
as they say):
scala> val ys = xs flatMap { | case _: B | _: C => None | case other => Some(other) | } ys: List[A] = List(D@7ecdc97b,E@2ce07e6b,E@468bb9d1) 在你的情况下,你得到一个List [ScalaObject],因为ScalaObject是None,D和E的最小上限。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |