我有一个Map<String, String>的String关键无非是像"123"等我得到的数值,因为这个数值是从UI在我的JSF组件来数值.我不想更改UI组件的合同.
现在我想创建一个Map<Long, String>基于上面的内容Map,我transform在Maps类中看到了一些方法但是所有方法都专注于转换值而不是键.
有没有更好的转换Map<String, String>方式Map<Long, String>?
这个问题有点已经发布在这里: 如何使用guava将Map <String,String>转换为Map <Long,String>
我认为CollinD的答案是恰当的:
所有Guava用于转换和过滤的方法都会产生惰性结果......函数/谓词仅在需要时应用,因为使用了对象.他们不创建副本.因此,转换很容易打破a的要求
Set.比方说,例如,你有一个
Map<String, String>包含"1"和"01"的键作为键.它们都是不同String的,因此Map可以合法地包含两个键.Long.valueOf(String)但是,如果使用它们进行变换 ,它们都会映射到该值1.它们不再是不同的关键.如果您创建地图副本并添加条目,则不会破坏任何内容,因为任何重复的密钥都将覆盖该密钥的上一个条目.Map然而,一个懒惰的转变,将无法强制执行唯一的密钥,因此将违反合同Map.
这是事实,但实际上我不明白为什么没有这样做,因为:
当密钥转换发生时,如果2个密钥被"合并",则可以引发运行时异常,或者我们可以传递一个标志以指示Guava为新计算的密钥获取多个可能值的任何值(failfast/failafe可能性) )
我们可以有一个Maps.transformKeys来生成Multimap
在做这些事情时我有没有看到的缺点?