如何在Scala中的Map
进行模式匹配?
(非工作)尝试包括,
Map("a"->1, "b"->2, "c"->3) match {
case Map(a,b,_*) => a
}
与
错误value Map is not a case class, nor does it have an unapply/unapplySeq member
case Map(a,b,_*) => a
错误是指示性的,但是如何使用Map
模式匹配方法来丰富unapply
?
非常感谢
更新
根据@Paul的评论,一个更整洁的用例可能是这样的,
Map("a"->1, "b"->2, "c"->3) match {
case Map("b"->2,_*) => "222"
}
,在这种情况下,如果地图包含映射到值b
的键2
。
答案 0 :(得分:7)
最简单的方法是将Map
转换为List
:
Map("a"->1, "b"->2, "c"->3).to[List] match {
case List(a,b,_*) => a
}
答案 1 :(得分:2)
使用Map
模式匹配方法丰富unapplySeq
的方法包括:
object MapExtractor {
def unapplySeq[A <% Ordered[A], B <% Ordered[B]]
(s: Map[A,B]): Option[Seq[(A,B)]] = Some(s.toSeq.sorted)
}
其中排序方法可以更改为任何可订购(项目可比较)逻辑。在这个例子中,
Map("b"->2, "a"->1, "c"->3) match {
case MapExtractor ( x, xs @ _* ) => println(s"x: $x") ; println(s"xs: $xs")
}
递送
x: (a,1)
xs: ArrayBuffer((b,2), (c,3))