gpt4 book ai didi

scala - 如何判断 Map 是否有默认值?

转载 作者:行者123 更新时间:2023-12-05 01:03:23 26 4
gpt4 key购买 nike

有没有办法检查 Map有定义的默认值吗?我想要的是 myMap.getOrElse(x, y)如果 key x不在 map 上,

  • 如果 myMap有一个默认值,返回该值
  • 否则返回 y

  • 该问题的一个人为示例:
    scala> def f(m: Map[String, String]) = m.getOrElse("hello", "world")
    f: (m: Map[String,String])String

    scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
    myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

    scala> f(myMap)
    res0: String = world

    在这种情况下,我想要 res0成为 "Z"而不是 "world" , 因为 myMap被定义为默认值。但是 getOrElse不能那样工作。

    我可以使用 m.apply而不是 m.getOrElse ,但不保证 map 具有默认值,因此它可能会引发异常(我可以捕获异常,但这是不理想的)。
    scala> def f(m: Map[String, String]) = try {
    | m("hello")
    | } catch {
    | case e: java.util.NoSuchElementException => "world"
    | }
    f: (m: Map[String,String])String

    scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
    myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

    scala> f(myMap)
    res0: String = Z

    scala> val mapWithNoDefault = Map("a" -> "A")
    mapWithNoDefault: scala.collection.immutable.Map[String,String] = Map(a -> A)

    scala> f(mapWithNoDefault)
    res1: String = world

    以上产生了预期值,但看起来很困惑。我无法进行模式匹配并调用 applygetOrElse基于 map 是否具有默认值,因为无论默认值如何,类型都是相同的( scala.collection.immutable.Map[String,String] )。

    有没有办法做到这一点不涉及捕获异常?

    最佳答案

    您可以检查 map 是否为Map.WithDefault的实例:

    implicit class EnrichedMap[K, V](m: Map[K, V]) {
    def getOrDefaultOrElse(k: K, v: => V) =
    if (m.isInstanceOf[Map.WithDefault[K, V]]) m(k) else m.getOrElse(k, v)
    }

    进而:
    scala> val myMap = Map("a" -> "A").withDefaultValue("Z")
    myMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

    scala> myMap.getOrDefaultOrElse("hello", "world")
    res11: String = Z

    scala> val myDefaultlessMap = Map("a" -> "A")
    myDefaultlessMap: scala.collection.immutable.Map[String,String] = Map(a -> A)

    scala> myDefaultlessMap.getOrDefaultOrElse("hello", "world")
    res12: String = world

    这种反射是否比对非异常控制流使用异常更好是一个悬而未决的问题。

    关于scala - 如何判断 Map 是否有默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702250/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com