为什么Guava不提供转换地图键的方法

时间:2012-12-21 14:13:16

标签: java guava

此问题已在此处发布: 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

在做这些事情时我是否有缺点?

1 个答案:

答案 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);
相关问题