在Scala列表中的某处匹配对象

时间:2013-01-25 17:17:41

标签: scala pattern-matching

我正在尝试在Scala列表上模式匹配模式,如果所需类型的对象包含在列表中的任何位置,该模式将匹配。

我试过了:

case _ :: (something: DesiredSubclass) :: _ => ???

但是,只有在我正在寻找的元素之前至少有一个元素时才会匹配。

3 个答案:

答案 0 :(得分:4)

使用if警卫以及exists更高阶的方法。

case xs if xs.exists(_.isInstanceOf[DesiredSubclass]) => ???

答案 1 :(得分:4)

使用公开的isInstanceOf[SomeType]是不雅观的。最好使用match - 类PartialFunction字面符号:

list.exists { case _: DesiredSubclass => true; case _ => false }

答案 2 :(得分:1)

模式匹配不能用于进行任意搜索。你可以

list.collect{ case something: DesiredSubclass => something }.headOption

获取其中的项目选项。你不能在匹配语句中指定它,但如果获得该特定类非常重要,你可以编写一个自定义提取器:

class DesiredSubclass(val s: String) {}
object FirstOfDesired {
  def unapply[A](xs: Seq[A]) = xs.collect{ case x: DesiredSubclass => x }.headOption
}

现在,例如:

val list = 7 :: (new DesiredSubclass("fish")) :: Nil
scala> list match { case FirstOfDesired(ds) => println(ds.s); case _ => }
fish