我有一个Map<String, String>
这个String
这个键只不过是数值,比如“123”等。我得到的数值是因为这个值来了来自我的JSF组件中的UI。我不想更改UI组件的合约。
现在我想根据上面的Map
创建一个Map<Long, String>
,我在Maps
类中看到了一些transform
方法,但都是关注转换值而不是关键。
有没有更好的方法将Map<String, String>
转换为Map<Long, String>
?如何将Map <String,String>转换为Map <Long,String>使用番石榴
回答
更新的Java 8
您可以使用流来做到这一点:
Map<Long, String> newMap = oldMap.entrySet().stream()
.collect(Collectors.toMap(e -> Long.parseLong(e.getKey()), Map.Entry::getValue));
这是假定所有键的Long
S适用字符串表示。另外,转换时可能会发生碰撞;例如,"0"
和"00"
都映射到0L
。
我认为你必须遍历在地图上:
Map<Long, String> newMap = new HashMap<Long, String>();
for(Map.Entry<String, String> entry : map.entrySet()) {
newMap.put(Long.parseLong(entry.getKey()), entry.getValue());
}
此代码假定你已经在消毒所有map
值(所以没有无效的长值)。
我希望有一个更好的解决方案。
编辑
我碰到在下议院收藏-utils的的从头开始,它只适用于实现CollectionUtils#transformedCollection(Collection, Transformer)
方法看起来似乎你想要做什么来了。Collection
的类。
@ Vivin的回答是正确的,但我认为这有助于解释为什么番石榴没有任何方法让您转换Map
(或转换Set
)的密钥。
所有Guava的转换和过滤方法都会产生延迟结果...函数/谓词仅在需要使用对象时才会应用。他们不创建副本。正因为如此,转换可以很容易地打破Set
的要求。
比方说,例如,您有一个包含“1”和“01”作为关键字的Map<String, String>
。它们都是不同的String
s,因此Map
可以合法地包含这两个键。如果使用Long.valueOf(String)
转换它们,则它们都映射到值1
。他们不再是独特的钥匙。如果您创建映射副本并添加条目,这不会破坏任何内容,因为任何重复的键都会覆盖该键的前一个条目。然而,延迟变形的Map
将无法执行唯一密钥,因此会破坏Map
的合同。
对不起,我直到后来才看到guava标签:p – 2011-04-20 18:14:30
简短的回答是不,番石榴不提供这个开箱即用。
简单的方法将如下所示。但是,有一些警告。
public static <K, V, L, W> Map<L, W> transformMap(Map<K, V> map, Function<K, L> keyFunction, Function<V, W> valueFunction) {
Map<L, W> transformedMap = newHashMap();
for (Entry<K, V> entry : map.entrySet()) {
transformedMap.put(
keyFunction.apply(entry.getKey()),
valueFunction.apply(entry.getValue()));
}
return transformedMap;
}
public static <K, V, L> Map<L, V> transformKeys(Map<K, V> map, Function<K, L> keyFunction) {
return transformMap(map, keyFunction, Functions.<V>identity());
}
番石榴的变压器都“懒”或视图为主。我认为要实现一个映射关键变换器,你需要一个双向函数。我的理解是,Guava团队正在开发一款Converter,它可以解决这个问题。
你碰到的另一个问题是,你必须处理重复的可能性,以便为“Jimmy-proof”,另一个番石榴原则。处理该问题的一种方法是返回Multimap;另一种情况是在遇到重复项时抛出异常。我不会建议的是隐藏问题,例如通过忽略重复键的后续条目,或者用重复键覆盖新条目。
您现在可以使用Java 8流,map,collect以更易读,干净的方式执行此操作。
Map<String, String> oldMap
Map<Long, String> newMap = oldMap.entrySet().stream()
.collect(Collectors.toMap(entry -> Long.parseLong(entry.getKey()), Map.Entry::getValue));
这里是下面的答案之一的更新版本,使生成的地图不可修改的(不,它不是用番石榴,只是普通的Java 8):
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toMap;
...
newMap = oldMap.entrySet().stream().collect(collectingAndThen(
toMap((Map.Entry<String, String> entry) -> transformKey(entry.getKey()),
(Map.Entry<String, String> entry) -> transformValue(entry.getValue())),
Collections::unmodifiableMap)));
- 1. 如何将HashMap <String,Integer> param转换为Map <String,Object)
- 2. 如何使用相同的递归函数迭代Map <String,String>和Map <String,Map <String,String >>?
- 3. 如何将List [List [Map [String,String]]]转换为List [Map [String,String]]
- 4. 无法从列表<map <string,object >>转换为列表<map <string,string >>
- 5. For-Each Loop,Map <String,Map <String,List <String> >>
- 6. Map <String,Map <String,Boolean >> myMap = new HashMap <String,HashMap <String,Boolean >>();
- 7. 如何将Map [String,Any]转换为Json?
- 8. 如何将breeze.linalg.DenseMatrix转换为Map [String,Value]?
- 9. map <string,string>在类
- 10. 如何在JAVA中将JAVAScript对象转换为Map <String,String>?
- 11. Post Map <String,List <String>>
- 12. 将undefined转换为map <string,AnonymousModel>时出错
- 13. std :: map <string,string>转换为字符串(第一个值)
- 14. 将Map [String,Double]转换为java.util.Map [String,java.lang.Double]
- 15. 番石榴:我如何将Collection <T>转换为Collection <Optional<T>>?
- 16. 番石榴的ComparisonChain转换为JavaScript
- 17. 番石榴功能
- 18. 番石榴的三元运算符问题:无法从订购<Comparable>转换为订购<String>
- 19. 将List <Map <String,Object >> row`的null转换为空字符串
- 20. 从List <Map <String,Object >>创建HashMap <String,Map>给出java.lang.ClassCastException
- 21. 如何转换XML列出<Map>
- 22. map <string,pair <string,foo * >>和map <string,pair <string,foo&>>有什么区别?
- 23. 将Map <Integer,Object>转换为Map <Integer,List <Object>>,不使用for循环(java)
- 24. 转换List <HashMap <String,String >>到列表<map <String,String >> java
- 25. 如何使用JSTL迭代Map <String,List> map = new HashMap <String,List>()在jsp页面中使用JSTL
- 26. 番石榴 - 过滤和转换图
- 27. Sort Map <String,List <Object[]>>
- 28. 使用键值在jsp中访问Map <Long,Map <String,Object >>的内容
- 29. Hibernate如何映射Map <Object,String>
- 30. 将值添加到列表<Map <String,String >>
我不认为有一个内置功能为此。虽然我没有看到太多用处,但您可能需要[提交功能请求](http://code.google.com/p/guava-libraries/issues/list)。 – 2011-04-20 15:58:10