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

2024-01-14

有没有办法检查是否Map有定义的默认值吗?我想要的是相当于myMap.getOrElse(x, y)如果关键在哪里x不在地图上,

  • if 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 to be "Z"代替"world", 因为myMap被定义为默认值。但getOrElse不是这样的。


我可以用m.apply代替m.getOrElse,但不保证地图有默认值,因此它可能会抛出异常(我可以捕获异常,但这并不理想)。

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

上面的结果是预期值,但看起来很混乱。我无法进行模式匹配和调用apply or getOrElse基于映射是否有默认值,因为类型是相同的(scala.collection.immutable.Map[String,String])无论默认性如何。

有没有一种方法可以做到这一点而不涉及捕获异常?


您可以检查地图是否是一个实例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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何判断 Map 是否有默认值? 的相关文章

  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 组合多个任意长度的列表

    我正在寻找一种通过以下方式加入多个列表的方法 ListA a b c ListB 1 2 3 4 ListC Resulting List a 1 b 2 c 3 4 换句话说 元素按顺序排列 从第一个列表开始组合到结果列表中 任意数量的输
  • kafka ProducerRecord 和 KeyedMessage 有什么区别

    我正在衡量卡夫卡生产者生产者的表现 目前我遇到了两个配置和用法略有不同的客户 Common def buildKafkaConfig hosts String port Int Properties val props new Proper
  • 在 Scala 中是否可以指定匿名函数的返回类型?

    我知道您可以创建一个匿名函数 并让编译器推断其返回类型 val x gt System currentTimeMillis 只是为了静态类型的缘故 是否也可以指定其返回类型 我认为这会让事情变得更加清晰 val x gt System cu
  • 词典类

    在 Java 字典类中 单个键是否可以有多个值 首先 关于字典类 该类被认为已过时 文档建议使用 Map 代替 您正在寻找的这种集合称为多重映射 您可以使用列表自己实现一个 但这很乏味 您可能想要使用 Apache Collections
  • 通过套接字发送包含文件的字典(python)

    是否可以通过套接字发送包含文件 图像或文档 作为值的字典 我尝试了类似下面的东西 但失败了 with open cat jpeg rb as f myFile f read 2048 data id 1283 filename cat jp
  • Scala SBT 版本依赖性二进制兼容性错误 scala-xml

    我有一个在 GitHub 上托管的项目 我使用 scala steward 来保持我的插件和依赖项最新 这在一段时间内有效 但现在使用此类自动更新却变成了一场噩梦 事情是这样的 在我的plugins sbt中 我依赖于scoverage 它
  • scala 中的模拟案例类:Mockito

    在我的游戏应用程序中 我打算模拟一个案例类 我可以这样做 但它创建了一个所有成员变量都为空的对象 有没有办法创建案例类的模拟对象 以便该对象可以初始化一些成员 case class User name String address Stri
  • 如何使用 `ProjectRef` 来引用 sbt 1.x 中的本地项目?

    其他答案中有很多含糊不清的内容 或者涉及到更旧版本的 sbt 即 0 12 x 但似乎没有人真正回答这个问题 鉴于我有一个文件夹 并且我已经运行 sbt new scala scala seed g8 name Scala Seed Pro
  • 具有动态命名参数的 Scala 案例类副本

    对于具有参数数量的 scala 案例类 21 e g case class Car type String brand String door Int 其中类型 吉普车 品牌 丰田 门 4 etc 还有一个复制方法允许使用命名参数覆盖 Ca
  • 匹配字典集。最优雅的解决方案。 Python

    给定两个字典列表 新的和旧的 字典在两个列表中表示相同的对象 我需要找到差异并生成新的字典列表 其中仅包含新字典中的对象和旧字典中的更新属性 例子 list new id 1 name bob desc cool guy id 2 name
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • 手动排除sbt中的一些测试类

    我通常在 CI 中执行以下命令 清理更新编译测试发布 但是 我想从 sbt 命令行中排除 1 个 或几个 测试类 我怎样才能做到这一点 我不想更改我的代码以使用忽略等 两种可能的选择 test only See http www scala
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • Scala Sparkcollect_list() 与 array()

    有什么区别collect list and array 在 Spark 中使用 scala 我看到到处都有使用情况 但我不清楚用例来确定差异 尽管两者array https spark apache org docs latest api
  • 如何列出所有 sbt 依赖项?

    我需要列出所有 sbt 依赖项 以便检查是否已存在 debian 软件包 我还注意到有一个 DEB 包 http www scala sbt org 0 13 tutorial Installing sbt on Linux html但似乎
  • akka http配置中的idle-timeout和request timeout有什么区别?

    我查阅了文档并发现了这些 空闲连接自动关闭的时间 设置infinite完全禁用空闲连接超时 空闲超时 10 秒 Defines the default time period within which the application has
  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • Scala 中缺少多重集吗?

    我正在尝试 Scala 中的 Facebook Hacker Cup 2013 资格赛问题 对于第三个问题 我觉得需要一个有序的 Multiset 但在 scala 的 2 10 集合中找不到一个 scala 的集合中是否缺少此数据结构 会

随机推荐

  • Pylint 中的模块“PyQt5.QtWidgets”中没有名称“QApplication”错误

    在尝试学习 PyQt5 时 在 VS Code 中遇到此问题 模块 PyQt5 QtWidgets 中没有名称 QApplication 模块 PyQt5 QtWidgets 中没有名称 QWidget 我不确定这是 pylint 问题还是
  • 为什么 `x-- > 0` 不是未定义行为,而 `x = x--` 是?

    众所周知 这会循环零 while x gt 0 also known as x gt 0 printf x d n x But x x yields 未定义的行为 https stackoverflow com questions 4910
  • Eclipse:查找方法的调用树

    I know that Ctrl Shift G gives an output of all the methods that call directly the method I m searching for But how can
  • 如何在 FFMPEG 中使用 Blend / tblend 过滤器与 t 变量和 Between 语句

    我想使用blend or tblend过滤器与t变量between陈述 我愿意接受其他能够达到相同效果的解决方案 我知道图像可以在视频上转置 例如之间00 00 01 000 to 00 00 02 000 ffmpeg i input m
  • django admin动态设置changeform初始数据

    我正在使用默认的 m2m 小部件通过中间模型实现 m2m 关系 我有Person and Project相关模型使用Membership model 到目前为止 我已经成功地在Person更改形式并正确创建中间模型实例 但我的问题是在Per
  • selenium PhantomJS send_keys 不起作用

    我正在使用 selenium 和 PhantomJS 进行测试 我遵循了 Selenium 的简单用法 但是 send keys 不适用于 PhantomJS 它适用于 Firefox 为什么 我必须使用button click 反而 us
  • Django 验证错误

    根据https docs djangoproject com en dev ref forms validation https docs djangoproject com en dev ref forms validation Good
  • Ruby 解释器 (CUI) 1.9.2p180 [i386-mingw32] 已停止工作(我没有使用 MySQL)

    我的 ruby 解释器在几乎每个页面请求上都会崩溃 并出现以下错误 Ruby 解释器 CUI 1 9 2p180 i386 mingw32 已停止工作 我没有使用 MySQL 也没有安装 gem 因为许多在线帖子都建议这是一个潜在原因 我可
  • *nix 伪终端如何工作?什么是主/从通道?

    我想在 Linux 系统上用 C 语言编写一个简单 愚蠢的 X 终端模拟器 起初 我只是想我必须打开一个 shell 并显示其输出 我检查了xterm和rxvt代码 看起来有点复杂 首先 我必须使用 openpty 打开一个伪终端 所以我查
  • 将 1 到 32 位数字附加到字符缓冲区

    我有一个char 缓冲区 我想附加各种位大小的整数 在1 and 32 to 因此 我需要一个函数 void addBits char buffer int bits appended so far int object int objec
  • 追加 DOM 元素两次 (jQuery)

    有人可以解释为什么以下代码片段没有添加
  • 并发写入同一缓存行中的不同位置

    假设我有一个 C 11 应用程序 其中两个线程写入不同但邻近内存位置 使用指向原始类型的简单指针 我能否确定这两个写入最终都会进入内存 可能在两者都达到boost barrier http www boost org doc libs 1
  • Rabbitmq 使用 .NET 使用单个同步调用检索多条消息

    有没有办法使用 NET 使用单个同步调用来接收多条消息 我见过question https stackoverflow com questions 17005515 rabbitmq retrieve multiple messages u
  • 如何对 Rails 中 Prawnto 生成的 PDF 进行内联格式(粗体和下划线)?

    我在 Rails 应用程序中使用 Prawn 和 Prawnto 插件生成 PDF 文件 我创建一个带有标准文本区域的标准表单 并将其作为 PDF 文件的正文提交 但是 我需要能够使用以下方式格式化单词和句子 bold 强调 也许不同的字体
  • 受影响的行实体框架

    如何获取 SaveChanges 后受影响的行数 The 保存更改 http msdn microsoft com en us library bb336792 aspx方法返回所有已更改项目的 int MSDN 片段 返回值 类型 Sys
  • 在javascript中选择区域/矩形

    我需要通过鼠标在 HTML5 页面中选择一个区域 然后我将与该区域内的元素进行交互 一定有一种简单的方法可以做到这一点 但我找不到现成的任何东西 不幸的是 jquery UI 选择不起作用 因为它似乎只支持一个父元素 有没有现成的东西可以在
  • 如何以编程方式突出显示 UIButton?

    很多用户抱怨 iPhone 上的小 i 信息按钮很难触摸 好吧 很简单 我只是在它后面贴了一个又大又大的隐形按钮 即使你用最粗心的手指触摸也不会错过它 当你触摸它时 它就会执行 infoButtonAction 事实是 我想让信息按钮本身闪
  • 递归算法的空间复杂度

    我在一次面试中被问到 解决问题的有效方法是检查回文 现在我可以做两件事 从 i 0 开始到 i n 2 并比较第 i 个和第 n 个字符是否相等 我可以使用递归来检查第一个和最后一个是否相同 并且字符串的其余部分是否为回文 第二个是递归的
  • 垃圾收集机制如何工作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 用外行术语来说 垃圾收集机制是如何工作的 如何识别对象可用于垃圾回收 还有 做什么Reference Counting Mark an
  • 如何判断 Map 是否有默认值?

    有没有办法检查是否Map有定义的默认值吗 我想要的是相当于myMap getOrElse x y 如果关键在哪里x不在地图上 if myMap有默认值 返回该值 否则返回y 该问题的一个人为示例 scala gt def f m Map S