加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

模式匹配Scala Map类型

发布时间:2020-12-16 09:20:15 所属栏目:安全 来源:网络整理
导读:想象一下,我在 Scala中有一个Map [String,String]. 我想匹配地图中的全套键值配对. 这样的东西应该是可能的 val record = Map("amenity" - "restaurant","cuisine" - "chinese","name" - "Golden Palace")record match { case Map("amenity" - "restaurant",
想象一下,我在 Scala中有一个Map [String,String].

我想匹配地图中的全套键值配对.

这样的东西应该是可能的

val record = Map("amenity" -> "restaurant","cuisine" -> "chinese","name" -> "Golden Palace")
record match {
    case Map("amenity" -> "restaurant","cuisine" -> "chinese") => "a Chinese restaurant"
    case Map("amenity" -> "restaurant","cuisine" -> "italian") => "an Italian restaurant"
    case Map("amenity" -> "restaurant") => "some other restaurant"
    case _ => "something else entirely"
}

编译器抱怨:

error:value Map不是一个case类构造函数,也没有一个unapply / unapplySeq方法

目前在地图中为键值组合模式匹配的最佳方式是什么?

解决方法

模式匹配不是你想要的.你想找到A是否完全包含B

val record = Map("amenity" -> "restaurant","name" -> "Golden Palace")
val expect = Map("amenity" -> "restaurant","cuisine" -> "chinese")
expect.keys.forall( key => expect( key ) == record( key ) )

编辑:添加匹配条件

这样,您可以轻松添加匹配条件

val record = Map("amenity" -> "restaurant","name" -> "Golden Palace")

case class FoodMatcher( kv: Map[String,String],output: String )

val matchers = List( 
    FoodMatcher(  Map("amenity" -> "restaurant","cuisine" -> "chinese"),"chinese restaurant,che che" ),FoodMatcher(  Map("amenity" -> "restaurant","cuisine" -> "italian"),"italian restaurant,mama mia" )
)

for {
    matcher <- matchers if matcher.kv.keys.forall( key => matcher.kv( key ) == record( key ) )
} yield matcher.output

得到:

名单(中餐馆,che che)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读