簡體   English   中英

Scala Map模式匹配

[英]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

錯誤指示就夠了,但如何豐富Mapunapply模式匹配的方法?

非常感謝

更新

根據@Paul的評論,一個更整潔的用例可能是這樣的,

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

即,在這種情況下, 如果map包含映射到值2b

最簡單的方法是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM