为什么 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 不提供转换映射键的方法 的相关文章

  • Objective-C 相当于 Java 枚举或“静态最终”对象

    我试图找到一个与 Java 枚举类型或 public static final 对象等效的 Objective C 例如 public enum MyEnum private String str private int val FOO f
  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 如何在 Java 中复制对象?

    考虑下面的代码 DummyBean dum new DummyBean dum setDummy foo System out println dum getDummy prints foo DummyBean dumtwo dum Sys
  • Jboss EAP 7 - 如何从部署中排除隐式模块(javax.jms)?

    我没想到我会来到这里 但经过大量 Google 和 StackOverflow 搜索后 我来到了这里 这就是我的确切问题 https www linkedin com pulse tale two jars marco antonio al
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • Android 的@hide 注解到底有什么作用?

    Android中很多内部API都被标记出来了 hide What exactly这是吗 另一个答案 https stackoverflow com questions 17035271 what does hide mean in the
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • 用二进制数、常规数字和格雷编码填充矩阵

    我有一个包含 1 s 或 0 s 的矩阵 用于创建二进制数 其宽度为n 对于 n 2 和 n 3 它看起来像 00 000 01 001 10 010 11 011 100 101 110 111 等等 现在我正在使用以下代码来生成它 in
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • 使用 ProcessBuilder 启动 CMD

    我尝试使用以下代码在 Windows 中启动 CMD 应用程序 但它无法按预期工作 来自不同网站的几个示例表明 cmd 作为 ProcessBuilder 构造中的参数应该有效 我需要做什么才能让我的 Java 应用程序在 Windows
  • 为什么找不到 getservletcontext?

    我正在尝试使用getServletContext getRealPath 但我不断收到此错误 cannot find symbol symbol method getServletContext location interface jav
  • 不鼓励在Web应用程序中使用线程吗?

    我们与同事就在 Java 的 Web 应用程序中使用线程进行了激烈的讨论 他们的观点是 不建议在 Java Web 应用程序中使用线程 因为它们不受容器管理 一般来说 我对此表示同意 因为线程可能会干扰容器 但是 如果它不是 Java EE
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下

随机推荐

  • 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