我有一个 Map[String, Info] 的 map ,它包含可以是大写或小写的键,如下所示:
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 中有没有一种方法可以让我通过键从 map 中获取值并忽略键的大小写?
最佳答案
有用于排序 map 的比较器,允许不区分大小写地从 map 中获取。示例:https://scastie.scala-lang.org/PfHTh16CROag7PNrknx1sQ
val map = scala.collection.immutable.SortedMap("key1" -> 45, "Key2" -> 43, "KEY3" -> 42)(scala.math.Ordering.comparatorToOrdering(String.CASE_INSENSITIVE_ORDER))
map.get("key1") // Some(45)
map.get("key2") // Some(43)
map.get("key3") // Some(42)
map.get("key4") // None
如果您在所有情况下都返回 Options,则可以解决您的实际问题,例如:
val info = map.get(key) match {
case somePi@Some(personInfo) => somePi
case None => map.get(key.toUpperCase()) match {
case Some(personInfo) => Some(personInfo)
case None => None
}
}
请注意
somePi@
=> somePi
用于引用表达式或 Some(personInfo)
的部分.大概值得解释为什么您收到此错误消息。我假设
personInfo
是 case class
实现 Product
和 Serializable
,就像 None
.它们的常见类型是 Product with Serializable
.
关于scala map 通过键获取值,键不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56141938/