[英]Scala Map pattern matching
如何在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"
}
即,在這種情況下, 如果map包含映射到值2
鍵b
。
最簡單的方法是tramsform Map
to List
:
Map("a"->1, "b"->2, "c"->3).to[List] match {
case List(a,b,_*) => a
}
使用unapplySeq
方法對模式匹配來豐富Map
的方法包括:
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.