【问题标题】:Why Guava does not provide a way to transform map keys为什么 Guava 不提供转换映射键的方法
【发布时间】:2012-12-21 14:13:15
【问题描述】:

这个问题已经在这里发布了: How to convert Map<String, String> to Map<Long, String> using guava

我觉得CollinD的回答比较合适:

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

假设,例如,您有一个 Map&lt;String, String&gt;,其中包含 “1”和“01”都作为键。它们都是不同的Strings,所以 Map 可以合法地包含两者作为键。如果您使用 Long.valueOf(String),但是,它们都映射到值 1。他们是 不再是不同的键。这不会破坏任何东西,如果你 创建地图的副本并添加条目,因为任何重复 键将覆盖该键的前一个条目。一个懒惰的 但是,转换后的Map 将无法强制执行唯一键 因此会违反Map的合同。

这是真的,但实际上我不明白为什么没有这样做,因为:

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

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

做这些事情有没有我看不到的缺点?

【问题讨论】:

  • 似乎更适合programmers.stackexchange.com

标签: java guava


【解决方案1】:

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

所以将Function&lt;K,NewK&gt; 应用到Map&lt;K,V&gt; 已经结束了。

您可以安全地将Function&lt;NewK,K&gt; 应用于地图:

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

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

Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2010-11-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多