为什么 Guava 不提供转换映射键的方法

2023-12-23

这个问题已经在这里发布了:如何使用番石榴将 Map 转换为 Map https://stackoverflow.com/questions/5733142/how-to-convert-mapstring-string-to-maplong-string-using-guava

我认为CollinD的回答是合适的:

Guava 的所有转换和过滤方法都会产生惰性 结果...函数/谓词仅在需要时应用 使用对象。他们不创建副本。正因为如此,尽管如此,一个 转型可以很容易地打破一个要求Set.

比方说,你有一个Map<String, String>其中包含 “1”和“01”都作为键。他们都是截然不同的Strings,所以Map可以合法地将两者作为键包含。如果你使用Long.valueOf(String)不过,它们都映射到值1。他们是 不再有不同的键。如果你这样做的话,这不会破坏任何东西 创建地图的副本并添加条目,因为任何重复的 键将覆盖该键的先前条目。懒洋洋地 转变的Map但是,无法强制执行唯一键 因此会违反合同Map.

这是事实,但实际上我不明白为什么不这样做,因为:

  • 当密钥转换发生时,如果 2 个密钥被“合并”,则可能会引发运行时异常,或者我们可以传递一个标志来指示 Guava 为新计算的密钥取多个可能值中的任何值(快速失败/失败安全可能性) )

  • 我们可以有一个 Maps.transformKeys 来生成一个 Multimap

做这样的事情有我看不到的缺点吗?


正如@CollinD 所建议的,没有办法以懒惰的方式做到这一点。实施get,您必须使用转换函数转换所有键(以确保发现任何重复项)。

所以申请Function<K,NewK> to Map<K,V> is out.

您可以安全地申请Function<NewK,K>到地图:

V value = innerMap.get( fn.apply(newK) );

我没有看到 Guava 的简写——它可能不够有用。您可以通过以下方式获得类似的结果:

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

为什么 Guava 不提供转换映射键的方法 的相关文章

随机推荐

  • HttpWebRequest getRequestStream 在多次运行时挂起

    我编写了一些代码来从侦听器发送和读取文本 这在第一次和第二次交换上运行良好 但在第三次发送时 调用之间有很长的延迟GetRequestStream 以及数据的实际写入 我已经按照此处的建议在发送端处理了输出流 以及流读取器和读取端的输入流
  • 在 R Synth 包中使用 dataprep 函数时出现令人困惑的错误

    我正在尝试使用 R 中的 Synth 包来探索某些政变对发生国家经济增长的影响 但我陷入了一个我无法理解的错误 当我尝试跑步时dataprep 我得到以下信息 Error in dataprep foo World predictors c
  • TypeError:callback.apply 不是allowDiskUse 之后的函数

    我有一个包含 100 万份文档的集合 我已经通过了以下选项allowDiskUse现在它抛出错误 TypeError callback apply is not a function 我已经搜索过这个但可以获得解决方案 请帮助 const
  • 有四个图标的工具栏如何设置像这样?

    有四个图标的工具栏如何设置像这样 我想在工具栏中设置四个类似图像的图标 我有制作工具栏 在 menu main xml 中设置图标 但我没有得到 为什么有人可以帮助我为什么它没有出现 样式 xml
  • 在 python 中使用 get_nowait() 不会引发空异常

    我有一个进程间队列 通常是空的 并且偶尔会出现一些东西 在我的一个线程中 我想定义一个像这样的 while 循环 def mythread queue1 while queue1 get nowait 1 do stuff 这非常有效 直到
  • 删除 T-SQL 文本中的所有注释

    我正在尝试删除所有评论NVARCHAR value 我不知道我会得到哪个值NVARCHAR变量 我需要删除所有以 开头的注释 直到行尾 例如 Some Comments SET NOCOUNT ON Some Comments SELECT
  • 如何在 Php 中将日期增加一天?

    我正在使用这种语法来增加上面的一天 但是当我输入这种格式时 它仍然给我这样的错误日期 01 01 1970 但我想要像 25 08 2016 这样的格式和日期 today 24 08 2016 nextday strftime d m Y
  • 绝对位置和保证金:自动

    我有一个小问题 我希望我的页脚停留在屏幕底部position absolute 但我的margin auto将其放在屏幕中间不再起作用 html
  • 3rd 方库“cordova-plugin-ms-azure-mobile-apps”在我的 Ionic 2 应用程序中未被识别

    在过去两天到处查看 并浏览各种网站上过去的论坛主题 并且没有解决方案之后 我在这里发帖作为最后的手段 我知道每个人都很忙 但这让我很累 我已经尝试了一切可能的方法 从多次从头开始创建应用程序 到一次添加一个库 然后运行并确保它正常工作 然后
  • 使用 MYSQL 数据库数据加载 Javascript 数组

    假设我有一个javascript数组 userName 我想从名为 user 的数据库表加载它 任何人都可以帮忙提供想法或示例代码吗 Thanks 你必须使用mysql connect mysql select db PHP 中的函数连接到
  • 使用 Amazon SQS 的最佳实践 - 轮询队列

    我正在设计一项为我们的电子商务网站发送电子邮件的服务 订单确认 提醒等 计划采用 SendEmail 方法 该方法生成代表要发送的电子邮件的 XML 块 并将其粘贴到 Amazon SQS 队列中 我的网络应用程序和其他应用程序将使用它来
  • Bootstrap 3 - 删除 md 和 lg 之间的断点

    我正在使用 Bootstrap 3 并尝试删除 排除中型和大型设备之间的断点 我有一个现有的网站 已优化为 970 像素 看起来很棒 我想做的是删除 md gt lg 断点 以便即使在大宽屏桌面上 最大主体宽度为 970px 并且仍然居中
  • Eclipse Android项目,如何在工作区中引用库?

    我按照我在这里找到的一些步骤 现在找不到 URL 抱歉 将 Eclipse 中的 Android 项目转换为布局 其中 99 9 的代码位于库项目中 然后我在下面还有另外 2 个 shell 项目相同的工作区 主要只是 AndroidMan
  • 在 Swift 中对 NSDictionary 对象的 NSArray 进行排序

    我已经从 API 检索了一些 JSON 数据 现在有一个充满 NSDictionary 对象的 NSArray 每个 NSDictionary 都有一个 名称 的键 值对 我想按该键 值对对 NSArray 进行排序 我已经做了很多搜索 但
  • 如何从 std::function 获取此指针?

    Since std function可以保存成员函数 因此它必须在某处存储指向对象实例的指针 我怎样才能获取this来自 a 的指针std function拥有成员函数 类型的对象std function持有一个可调用对象 指向成员函数的指
  • 添加额外的圆括号 - 代码无法编译

    所以 我有一个返回布尔值的函数 bool func true do some stuff return true 现在实际代码这样调用 if auto err func true some stuff std cout lt lt std
  • 如何在 BootstrapVue 轮播中包含图像?

    我正在尝试将图像添加到img src BoostrapVue 中 b carousel 的属性 该图像当前保存在 asset 文件夹中
  • 在codeigniter中加载google api客户端库

    首先 我将 Google 文件夹复制到 codeigniter 框架中的 application third party 中 然后是应用程序 库中的 google php
  • 如何使用 YourKit 分析 Domino Agents (AMgr)?

    由于我在使用大型 Domino 代理时遇到问题 因此我希望能够对其进行分析 我听过很多关于 Yourkit 的好消息 并按照 David Leedy 视频中的说明进行操作 http notesin9 com index php 2012 1
  • 为什么 Guava 不提供转换映射键的方法

    这个问题已经在这里发布了 如何使用番石榴将 Map 转换为 Map https stackoverflow com questions 5733142 how to convert mapstring string to maplong s