我有一个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. 如何将List <Map <String,Long>转换成TreeMap或Map?
- 2. 如何使用番石榴将MultiMap <Integer,Foo>转换为Map <Integer,Set <Foo>>?
- 3. 如何将HashMap <String,Integer> param转换为Map <String,Object)
- 4. 将列表<Map <String,Object >>转换为Map <String,Integer>
- 5. 如何使用相同的递归函数迭代Map <String,String>和Map <String,Map <String,String >>?
- 6. 如何将List [List [Map [String,String]]]转换为List [Map [String,String]]
- 7. 如何将java Future <V>转换为番石榴ListenableFuture <V>
- 8. 无法从列表<map <string,object >>转换为列表<map <string,string >>
- 9. For-Each Loop,Map <String,Map <String,List <String> >>
- 10. Apache Hive:将Map <string,string>转换为json字符串?
- 11. 将对象转换为java中的Map <String,String>
- 12. Map <String,Map <String,Boolean >> myMap = new HashMap <String,HashMap <String,Boolean >>();
- 13. Java8在Map <Object,String>中转换[List <Object>,String]
- 14. 如何将Map [String,Any]转换为Json?
- 15. 如何将breeze.linalg.DenseMatrix转换为Map [String,Value]?
- 16. 如何转换番石榴,列表<String>和列表<Integer>在另一个列表<Person>?
- 17. 如何从Map <String,Map <String,String >>中检索内容?
- 18. Map <Integer,String>或String []?
- 19. map <string,string>在类
- 20. Hadoop Map Reduce:MapOutputValueClass:Map <String,String>?
- 21. 如何将Map <String,String>更改为Map <String,Ratio>,比率为x/y
- 22. 如何在JAVA中将JAVAScript对象转换为Map <String,String>?
- 23. 如何将Map <String,String>转换为自定义JSON格式?
- 24. 如何将Excel文件读入List <Map <String,String >>
- 25. Map <String,Integer>和Map <Integer,String>排序
- 26. Post Map <String,List <String>>
- 27. 将undefined转换为map <string,AnonymousModel>时出错
- 28. std :: map <string,string>转换为字符串(第一个值)
- 29. 将Map [String,Double]转换为java.util.Map [String,java.lang.Double]
- 30. 番石榴:我如何将Collection <T>转换为Collection <Optional<T>>?
我不认为有一个内置功能为此。虽然我没有看到太多用处,但您可能需要[提交功能请求](http://code.google.com/p/guava-libraries/issues/list)。 – 2011-04-20 15:58:10