Java 为什么Guava不提供变换贴图关键点的方法

Java 为什么Guava不提供变换贴图关键点的方法,java,guava,Java,Guava,这个问题已经发布在这里了: 我认为柯林斯的回答是恰当的: Guava的所有转换和过滤方法都会产生惰性 结果。。。函数/谓词仅在需要作为 对象被使用。他们不创建副本。然而,正因为如此,一个 转换可以很容易地打破集合的要求 比方说,您有一个映射,其中包含 “1”和“01”都作为键。它们都是不同的Strings,因此 Map可以合法地包含这两个键。如果使用 但是,它们都映射到值1。他们是 不再使用不同的键。这不会破坏任何东西,如果你 创建地图副本并添加条目,因为任何副本 密钥将覆盖该密钥的上一个条目

这个问题已经发布在这里了:

我认为柯林斯的回答是恰当的:

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

比方说,您有一个
映射
,其中包含 “1”和“01”都作为键。它们都是不同的
String
s,因此
Map
可以合法地包含这两个键。如果使用 但是,它们都映射到值
1
。他们是 不再使用不同的键。这不会破坏任何东西,如果你 创建地图副本并添加条目,因为任何副本 密钥将覆盖该密钥的上一个条目。懒散地 不过,转换后的
Map
,将无法强制执行唯一键 因此会破坏
地图
的合同

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

  • 当密钥转换发生时,如果两个密钥“合并”,可能会引发运行时异常,或者我们可以传递一个标志,指示Guava为新计算的密钥获取多个可能值中的任何值(failfast/failsafe可能性)

  • 我们可以有一个Maps.transformKeys来生成一个多重映射


做这样的事情有我看不到的缺点吗?

正如@CollinD所建议的,没有办法偷懒地做这件事。要实现
get
,必须使用转换功能转换所有键(以确保发现任何重复项)

因此,将
函数
应用于
映射
是不可能的

您可以安全地将
功能
应用于地图:

V value = innerMap.get( fn.apply(newK) );
我看不到番石榴的速记法——它可能还不够有用。您可以通过以下方式获得类似的结果:

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

似乎更适合程序员。stackexchange.com