这个问题有点已经发布在这里: 如何使用guava将Map <String,String>转换为Map <Long,String>
我认为CollinD的答案是恰当的:
所有Guava用于转换和过滤的方法都会产生惰性结果......函数/谓词仅在需要时应用,因为使用了对象.他们不创建副本.因此,转换很容易打破a的要求
Set.比方说,例如,你有一个
Map<String, String>包含"1"和"01"的键作为键.它们都是不同String的,因此Map可以合法地包含两个键.Long.valueOf(String)但是,如果使用它们进行变换 ,它们都会映射到该值1.它们不再是不同的关键.如果您创建地图副本并添加条目,则不会破坏任何内容,因为任何重复的密钥都将覆盖该密钥的上一个条目.Map然而,一个懒惰的转变,将无法强制执行唯一的密钥,因此将违反合同Map.
这是事实,但实际上我不明白为什么没有这样做,因为:
当密钥转换发生时,如果2个密钥被"合并",则可以引发运行时异常,或者我们可以传递一个标志以指示Guava为新计算的密钥获取多个可能值的任何值(failfast/failafe可能性) )
我们可以有一个Maps.transformKeys来生成Multimap
在做这些事情时我有没有看到的缺点?
正如@CollinD所暗示的那样,没有办法以懒惰的方式做到这一点.要实现get,您必须使用转换函数转换所有键(以确保发现任何重复项).
因此申请Function<K,NewK>即将Map<K,V>结束.
您可以安全地申请Function<NewK,K>到地图:
V value = innerMap.get( fn.apply(newK) );
Run Code Online (Sandbox Code Playgroud)
我没有看到番石榴的简写 - 它可能不够有用.你可以得到类似的结果:
Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7035 次 |
| 最近记录: |