此问题已在此处发布: How to convert Map<String, String> to Map<Long, String> using guava
我认为CollinD的答案是恰当的:
所有用于转换和过滤的Guava方法都会产生懒惰 结果...函数/谓词仅在需要时应用 使用对象。他们不会创建副本。因此,a 转换很容易打破
Set
的要求。比方说,例如,您有一个
Map<String, String>
两个&#34; 1&#34;和&#34; 01&#34;作为钥匙。它们都是不同的String
s,所以Map
可以合法地包含两个键。如果你使用它们进行转换 但是,Long.valueOf(String)
,它们都映射到值1
。他们是 不再是不同的钥匙。如果你这不会打破任何事情 创建地图的副本并添加条目,因为任何重复 键将覆盖该键的上一个条目。一个懒洋洋的 但是,转换Map
无法强制执行唯一键 因此会违反Map
的合同。
这是事实,但实际上我并不理解为什么没有这样做,因为:
当密钥转换发生时,如果2个密钥被&#34;合并&#34;,则可以引发运行时异常,或者我们可以传递一个标志来指示Guava采取多个可能的值新计算密钥的值(failfast / failsafe possible)
我们可以使用Maps.transformKeys生成Multimap
在做这些事情时我是否有缺点?
答案 0 :(得分:8)
正如@CollinD建议的那样,没有办法以懒惰的方式做到这一点。要实现get
,您必须使用转换函数转换所有键(以确保发现任何重复项)。
因此,将Function<K,NewK>
应用于Map<K,V>
即可。
您可以安全地将Function<NewK,K>
应用于地图:
V value = innerMap.get( fn.apply(newK) );
我没有看到番石榴的简写 - 它可能不够有用。你可以得到类似的结果:
Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);