scala - 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中有没有一种方法可以让我按键从地图中获取价值并忽略按键的情况?
解决方案
你可以用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")
推荐阅读
- python - 使用列表推导替换嵌套的 for 循环
- python - 输入层和第一个 LSTM 层的 Keras 功能 API 问题
- sql-server - 对连接管理器 PostgreSQL30.app_user 的 AcquireConnection 方法调用失败,错误代码为 0xC0014009
- django - Django Heroku raise ValueError("Missing staticfiles manifest entry for '%s'" % clean_name)
- css - 将文本放置在图像上,使其始终指向图像中的同一位置,即使在调整浏览器大小时也是如此
- function - 计算两个时间戳之间的工作日
- python - PyInstaller: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 112: invalid start byte
- python - 使用不同格式的另一个 df 为 df 赋值
- swift - SwiftUI Word Wrap 用于多行文本 Word 断字问题
- .net - 使用 ReportViewer 在表单上显示的组合项