Scala Map模式匹配

elm*_*elm 6 scala map pattern-matching scala-collections

如何Map在Scala中进行模式匹配?

(非工作)尝试包括,

Map("a"->1, "b"->2, "c"->3) match {
  case Map(a,b,_*) => a
}
Run Code Online (Sandbox Code Playgroud)

哪个错了

value Map is not a case class, nor does it have an unapply/unapplySeq member
              case Map(a,b,_*) => a
Run Code Online (Sandbox Code Playgroud)

错误是指示性的,但如何丰富模式匹配Mapunapply方法?

非常感谢

更新

根据@Paul的评论,一个更整洁的用例可能是这样的,

Map("a"->1, "b"->2, "c"->3) match {
  case Map("b"->2,_*) => "222"
}
Run Code Online (Sandbox Code Playgroud)

即,在这种情况下,如果map包含b映射到值的键2.

Yur*_*riy 7

最简单的方法是tramsform Mapto List:

Map("a"->1, "b"->2, "c"->3).to[List] match {
  case List(a,b,_*) => a
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管@EndeNeu 发表了评论,但我认为地图通常不是有序的。 (2认同)

elm*_*elm 3

一种利用模式匹配方法进行丰富的方法Map包括unapplySeq

object MapExtractor {
  def unapplySeq[A <% Ordered[A], B <% Ordered[B]]
      (s: Map[A,B]): Option[Seq[(A,B)]] = Some(s.toSeq.sorted) 
}
Run Code Online (Sandbox Code Playgroud)

其中排序方法可以更改为任何可排序(可比较的项目)逻辑。在这个例子中,

Map("b"->2, "a"->1, "c"->3) match {
  case MapExtractor ( x, xs @ _* ) => println(s"x: $x") ; println(s"xs: $xs") 
}
Run Code Online (Sandbox Code Playgroud)

交付

x: (a,1)
xs: ArrayBuffer((b,2), (c,3))
Run Code Online (Sandbox Code Playgroud)