这个问题已经在这里发布了:如何使用番石榴将 Map 转换为 Map https://stackoverflow.com/questions/5733142/how-to-convert-mapstring-string-to-maplong-string-using-guava
我认为CollinD的回答是合适的:
Guava 的所有转换和过滤方法都会产生惰性
结果...函数/谓词仅在需要时应用
使用对象。他们不创建副本。正因为如此,尽管如此,一个
转型可以很容易地打破一个要求Set
.
比方说,你有一个Map<String, String>
其中包含
“1”和“01”都作为键。他们都是截然不同的String
s,所以Map
可以合法地将两者作为键包含。如果你使用Long.valueOf(String)
不过,它们都映射到值1
。他们是
不再有不同的键。如果你这样做的话,这不会破坏任何东西
创建地图的副本并添加条目,因为任何重复的
键将覆盖该键的先前条目。懒洋洋地
转变的Map
但是,无法强制执行唯一键
因此会违反合同Map
.
这是事实,但实际上我不明白为什么不这样做,因为:
做这样的事情有我看不到的缺点吗?
正如@CollinD 所建议的,没有办法以懒惰的方式做到这一点。实施get
,您必须使用转换函数转换所有键(以确保发现任何重复项)。
所以申请Function<K,NewK>
to Map<K,V>
is out.
您可以安全地申请Function<NewK,K>
到地图:
V value = innerMap.get( fn.apply(newK) );
我没有看到 Guava 的简写——它可能不够有用。您可以通过以下方式获得类似的结果:
Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)