scala地图-什么';如果某个键不可用,那么尝试其他键的最佳方法是';不存在

scala地图-什么';如果某个键不可用,那么尝试其他键的最佳方法是';不存在,scala,scala-collections,Scala,Scala Collections,给定Scala中的一个映射,我想尝试第一个键,如果找不到,请尝试其他键,如果再次找不到,请返回None。以下工作如预期: val分数:Map[String,Int]=Map(“Alice”->10,“Bob”->3) val singleGet:Option[Int]=scores.get(“NotAKey”) println(singleGet)//无 val doubleGet=scores.getOrElse(“NotAKey”,scores.get(“notakeyreach”)//如果

给定Scala中的一个映射,我想尝试第一个键,如果找不到,请尝试其他键,如果再次找不到,请返回None。以下工作如预期:

val分数:Map[String,Int]=Map(“Alice”->10,“Bob”->3)
val singleGet:Option[Int]=scores.get(“NotAKey”)
println(singleGet)//无
val doubleGet=scores.getOrElse(“NotAKey”,scores.get(“notakeyreach”)//如果没有类型,则工作正常
println(doubleGet)//无
但如果我为doubleGet输入一个类型,它会出错:


val-doubleGet:Option[Int]=scores.getOrElse(“NotAKey”,scores.get(“notakeyreach”)//错误
“Any类型的表达式不符合预期的类型选项[Int]”


那么什么是最好的方法呢?

你对自己想做的事情有很好的直觉,那就是:
“测试一个键,如果不存在,则检查第二个键”

另外,您的返回类型是正确的,因为您没有提供任何默认值,并且不能保证这两个键都应该存在。
但是,您的问题是
scores.getOrElse(“NotAKey”,scores.get(“notakeyreach”)
将返回Any
为什么?因为
getOrElse
返回两个备选方案的LUB(最小上界)。在这种情况下,默认值是
选项[Int]
,但成功检索第一个键的类型是
Int

您真正需要的是一种组合两个选项的方法,在第一个选项不存在的情况下使用第二个选项。这正是我们所做的

您可以在地图上创建一些扩展方法,使使用更加简单

implicit class MapOps[K, V](private val map: Map[K, V]) extends AnyVal {
  def doubleGet(key1: K, key2: K): Option[V] =
    map.get(key1) orElse map.get(key2)

  def doubleGetOrElse[V1 >: V](key1: K, key2: K)(default: => V1): V1 =
    (map.get(key1) orElse map.get(key2)).getOrElse(default)

  def multiGet(keys: K*): Option[V] =
    keys.iterator.map(key => map.get(key)).foldLeft(Option.empty[V])(_ orElse _)

  def multiGetOrElse[V1 >: V](keys: K*)(default: => V1): V1 =
    keys.iterator.map(key => map.get(key)).foldLeft(Option.empty[V])(_ orElse _).getOrElse(default)
}

val scores: Map[String, Int] = Map("Alice" -> 10, "Bob" -> 3)
scores.doubleGet("A", "B") // res: Option[Int] = None
scores.multiGet("A", "Alice", "B") // res: Option[Int] = Some(10)

你对自己想做的事情有很好的直觉,即:
“测试一个键,如果不存在,则检查第二个键”

另外,您的返回类型是正确的,因为您没有提供任何默认值,并且不能保证这两个键都应该存在。
但是,您的问题是
scores.getOrElse(“NotAKey”,scores.get(“notakeyreach”)
将返回Any
为什么?因为
getOrElse
返回两个备选方案的LUB(最小上界)。在这种情况下,默认值是
选项[Int]
,但成功检索第一个键的类型是
Int

您真正需要的是一种组合两个选项的方法,在第一个选项不存在的情况下使用第二个选项。这正是我们所做的

您可以在地图上创建一些扩展方法,使使用更加简单

implicit class MapOps[K, V](private val map: Map[K, V]) extends AnyVal {
  def doubleGet(key1: K, key2: K): Option[V] =
    map.get(key1) orElse map.get(key2)

  def doubleGetOrElse[V1 >: V](key1: K, key2: K)(default: => V1): V1 =
    (map.get(key1) orElse map.get(key2)).getOrElse(default)

  def multiGet(keys: K*): Option[V] =
    keys.iterator.map(key => map.get(key)).foldLeft(Option.empty[V])(_ orElse _)

  def multiGetOrElse[V1 >: V](keys: K*)(default: => V1): V1 =
    keys.iterator.map(key => map.get(key)).foldLeft(Option.empty[V])(_ orElse _).getOrElse(default)
}

val scores: Map[String, Int] = Map("Alice" -> 10, "Bob" -> 3)
scores.doubleGet("A", "B") // res: Option[Int] = None
scores.multiGet("A", "Alice", "B") // res: Option[Int] = Some(10)

val doubleGet:Option[Int]=scores.get(“NotAKey”)或lse scores.get(“notakeyeach”)
@LuisMiguelMejíaSuárez啊,谢谢!你能把它作为一个答案,这样我就可以标记它了吗?
val doubleGet:Option[Int]=scores.get(“NotAKey”)或lse scores.get(“notakeyreach”)
@luismguelmejíaSuárez啊,谢谢!你能把它作为一个答案,这样我就可以标记它了吗?