首页 > 解决方案 > scala map 通过键获取值,键不区分大小写

问题描述

我有一个 Map[String, Info] 的地图,它包含可以是大写或小写的键,如下所示:

person1: PersonInfo1
person2: PersonInfo2
PERSON1: PersonInfo1

我想获取键“person1”的值,如果没有找到,我会尝试使用键“PERSON1”,我尝试了以下代码:

val info = map.get(key) match {
  case Some(personInfo) => personInfo
  case None =>
    map.get(key.toUpperCase()) match {
      case Some(personInfo) => personInfo
      case None             => None
    }
}

但是这个返回信息作为具有可序列化的产品类型,我怎样才能将信息作为 PersonInfo 类型返回?Scala中有没有一种方法可以让我按键从地图中获取价值并忽略按键的情况?

标签: scalahashmap

解决方案


你可以用orElse. 我会为此创建一个扩展方法:

implicit class CaseInsensitiveGetMap[V] (m: Map[String,V]) {
   def iget (key: String): Option[V] = m.get(key)
      .orElse(m.get(key.toUpperCase())) //you can add more orElse in chain
}

然后你可以像这样使用它:

map.iget("person2")

推荐阅读