鑑於異構序列,我如何才能僅抽取某種類型的成員,並以類型安全的方式對這些成員進行操作?Scala:在一個操作中過濾和投射
如果我有:
trait Foo
case class Bar(baz: String)
case class Qux(bar: Bar, quux: String) extends Foo
case class Corge(grault: Int) extends Foo
如果我想利用混合Corges
和Quxes
這個順序...
val s = Seq[Foo](Corge(1), Qux(Bar("2"), "3"), Qux(Bar("4"), "5"), Corge(6), Qux(Bar("2"), "7"))
...並拉出只是Quxes
,通過分組Bar
:
Map(
Bar(2) -> List(Qux(Bar(2),3), Qux(Bar(2),7)),
Bar(4) -> List(Qux(Bar(4),5))
)
我可以這樣做:
s filter { f => f.isInstanceOf[Qux] } groupBy {
f => f.asInstanceOf[Qux].bar }
或者,我可以這樣做:
(s.filter({ f => f.isInstanceOf[Qux] }).asInstanceOf[Seq[Qux]]) groupBy {
q => q.bar }
但無論哪種方式,我需要兩個instanceOf
檢查,當它看起來像我應該能夠與一個脫身。或者沒有。是否有一些我缺少的巧妙模式匹配解決方案?