Scala:在一个操作中过滤和强制转换

Scala:在一个操作中过滤和强制转换,scala,collections,Scala,Collections,给定一个异构序列,如何仅提取特定类型的成员,并以类型安全的方式对这些成员进行操作 如果我有: 如果我想取混合的Corges和Quxes val s=Seq[Foo](第(1)小节、第(2)小节、第(3)小节、第(4)小节、第(5)小节、第(6)小节、第(2)小节、第(7)小节) …然后只拉出按条分组的qux: Map( 条形图(2)->列表(Qux(条形图(2),3),Qux(条形图(2,7)), 小节(4)->列表(Qux(小节(4),5)) ) 我可以这样做: s filter{f=>

给定一个异构序列,如何仅提取特定类型的成员,并以类型安全的方式对这些成员进行操作

如果我有:

如果我想取混合的
Corges
Quxes

val s=Seq[Foo](第(1)小节、第(2)小节、第(3)小节、第(4)小节、第(5)小节、第(6)小节、第(2)小节、第(7)小节)
…然后只拉出按
条分组的
qux

Map(
条形图(2)->列表(Qux(条形图(2),3),Qux(条形图(2,7)),
小节(4)->列表(Qux(小节(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}

但无论哪种方式,我都需要两个
实例的
检查,而看起来我应该可以侥幸逃脱一个。或者没有。我缺少一些聪明的模式匹配解决方案吗?

不需要显式的
实例,只需要在
案例中使用类时得到的隐式的

$ scala
Welcome to Scala version 2.9.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val a : Seq[Any] = List(1, 2, "asdf", 4)
a: Seq[Any] = List(1, 2, asdf, 4)

scala> val b = a flatMap {i:Any => i match { case s:String => Some(s); case _ => None }}
b: Seq[String] = List(asdf)

注意
a
b
的类型比Daniel Martin的解决方案更好的是使用
collect

val a: Seq[Any] = List(1, 2, "asdf", 4)
a: Seq[Any] = List(1, 2, asdf, 4)

val b = a collect { case s: String => s }
b: Seq[String] = List(asdf)
val a: Seq[Any] = List(1, 2, "asdf", 4)
a: Seq[Any] = List(1, 2, asdf, 4)

val b = a collect { case s: String => s }
b: Seq[String] = List(asdf)