加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

按类型筛选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的最小上限。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读